在windows下python3使用multiprocessing.Pool时出现的问题

from multiprocessing import Pool 
def f(x):    
   return x*x
pool = Pool(processes=4)
r=pool.map(f, range(100))        
pool.close() 
pool.join() 
在spyder里运行直接没反应;在shell窗口里,直接报错,如下:
Process SpawnPoolWorker-15:Traceback (most recent call last):  
File "C:\Anaconda3\lib\multiprocessing\process.py", line 254, in _bootstr self.run()  
File "C:\Anaconda3\lib\multiprocessing\process.py", line 93, in run self._target(*self._args, **self._kwargs)  
File "C:\Anaconda3\lib\multiprocessing\pool.py", line 108, in worker task = get()  File "C:\Anaconda3\lib\multiprocessing\queues.py", line 357, in get    
return ForkingPickler.loads(res)AttributeError: 
Can't get attribute 'f' on <module'__main__' (built-in)

解决:Windows下面的multiprocessing跟Linux下面略有不同,Linux下面基于fork,fork之后所有的本地变量都复制一份,因此可以使用任意的全局变量;在Windows下面,多进程是通过启动新进程完成的,所有的全局变量都是重新初始化的,在运行过程中动态生成、修改过的全局变量是不能使用的。multiprocessing内部使用pickling传递map的参数到不同的进程,当传递一个函数或类时,pickling将函数或者类用所在模块+函数/类名的方式表示,如果对端的Python进程无法在对应的模块中找到相应的函数或者类,就会出错。当你在Interactive Console当中创建函数的时候,这个函数是动态添加到__main__模块中的,在重新启动的新进程当中不存在,所以会出错。当不在Console中,而是在独立Python文件中运行时,你会遇到另一个问题:由于你下面调用multiprocessing的代码没有保护,在新进程加载这个模块的时候会重新执行这段代码,创建出新的multiprocessing池,无限调用下去。解决这个问题的方法是永远把实际执行功能的代码加入到带保护的区域中:if __name__ == '__mian__':

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值