python多进程下运行类方法的坑

多进程运行类方法:

  1. 通常情况下我们习惯运行多进程的方法是导入multiprocessing包,进而创建多进程并运行start方法进行启动。这个操作直接运行某个函数是没有错的,例如:
def like_cheese():
    pid = os.getpid()
    print(pid)
    for i in range(10):
        print(i)
        time.sleep(2)
        if i == 5:
            cmd = "kill -9 %d" % int(pid)
            os.system(cmd)
 if __name__ == '__main__':
    pid = os.getpid()
    print(pid)
    while True:
        prpcess = multiprocessing.Process(target=like_cheese)
        prpcess.start()
        prpcess.join()
        if not prpcess.is_alive():
            os.system(r'python3 ./xiao.py')

这种情况下是可以正常运行的。但是下面这个例子就不能正常运行了:

class FbPageRollback:
    def __init__(self):
    	pass
    def run(self):
    	for i in range(10):
    		print(i)
if __name__ == '__main__':
	rollback_obj = FbPageRollback()
    multiprocessing.Process(target=rollback_obj.run).start() 	

此时报如下错误:

Traceback (most recent call last):
  File "F:/PythonProject/globalegrow/spider/fb_page_rollback.py", line 620, in <module>
    multiprocessing.Process(target=rollback_obj.run).start()
  File "C:\Users\xiaomeng\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Users\xiaomeng\AppData\Local\Programs\Python\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\xiaomeng\AppData\Local\Programs\Python\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Users\xiaomeng\AppData\Local\Programs\Python\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\xiaomeng\AppData\Local\Programs\Python\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle module objects

查询得知是在序列化和反序列化的过程中出现错误,也就是说此Python多进程不能直接在用上述的start直接开启多进程运行类方法,那有其它办法可以解决吗?答案是肯定的。我们可以在类的外部写一个函数,通过运行外部函数来运行类方法,其次通过下面这个方法来启动类方法。

p = multiprocessing.Process(target=self.multi_process)
p.run()

感兴趣的可以了解一些多进程启动的两种方法,start与run,会发现其实start最终还是通过run启动多进程。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
Python中实现多进程方法有多种。其中一种常用的方法是使用`multiprocessing`模块。该模块提供了创建和管理进程的功能。 首先,你可以使用`Process`创建一个进程对象,将需要执行的函数和参数作为参数传递给`Process`的构造函数。然后,调用进程对象的`start`方法来启动进程。 ```python from multiprocessing import Process def func(arg1, arg2): # 执行具体的任务 print(arg1, arg2) if __name__ == '__main__': p = Process(target=func, args=(arg1_value, arg2_value)) p.start() ``` 另一种常用的方法是使用`Pool`来创建进程池。进程池可以管理多个进程,以便并行执行任务。你可以使用`apply_async`方法将任务提交给进程池,并使用`close`方法关闭进程池,再使用`join`方法等待所有子进程执行完毕。 ```python from multiprocessing import Pool def func(arg): # 执行具体的任务 print(arg) if __name__ == '__main__': p = Pool(processes=3) for i in range(10): p.apply_async(func, args=(i,)) p.close() p.join() ``` 需要注意的是,进程之间的变量是无法直接共享的。即使是全局变量也不能在多个进程之间共享。如果你需要在进程之间共享数据,可以使用`Manager`对象或`Queue`对象等进程间通信的方式来实现。 总结起来,Python中实现多进程方法包括使用`Process`创建进程对象并启动进程,以及使用`Pool`创建进程池并提交任务。同时,需要注意进程之间的变量是无法直接共享的,可以使用进程间通信的机制来实现数据共享。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python多进程中常用方法用法详解](https://blog.csdn.net/weixin_44799217/article/details/127624211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值