Python 多重加工中的酸洗
以下代码的目标只是用0到9填充数组: 在尝试调用函数中的多进程时,出现pickle错误:Python 多重加工中的酸洗,python,parallel-processing,multiprocessing,pickle,joblib,Python,Parallel Processing,Multiprocessing,Pickle,Joblib,以下代码的目标只是用0到9填充数组: 在尝试调用函数中的多进程时,出现pickle错误: AttributeError: Can't pickle local object 'processInput.<locals>.testNested' AttributeError:无法pickle本地对象'processInput..testNested' 问题:如果我必须在其他函数中操作多进程,有什么建议如何实现这个目标吗?内置包中有一些示例,我稍微修改了第一个,其中包括使用类: c
AttributeError: Can't pickle local object 'processInput.<locals>.testNested'
AttributeError:无法pickle本地对象'processInput..testNested'
问题:如果我必须在其他函数中操作多进程,有什么建议如何实现这个目标吗?内置包中有一些示例,我稍微修改了第一个,其中包括使用类:
class multiprocessing.pool.pool([processs[,initializer[,initargs[,maxstasksperchild[,context\\\\]]])
一个进程池对象,它控制作业可以提交到的工作进程池。它支持带有超时和回调的异步结果,并具有并行映射实现
进程
是要使用的工作进程数。如果进程为None
,则使用返回的数字
如果初始值设定项
不是None
,则每个工作进程在启动时将调用初始值设定项(*initargs)
maxtasksparchild
是工作进程在退出并替换为新工作进程之前可以完成的任务数,以释放未使用的资源。默认的maxtasksperchild
为None
,这意味着工作进程将与池一样长时间地存在
上下文
可用于指定用于启动工作进程的上下文。通常使用上下文对象的函数multiprocessing.pool()
或pool()
方法创建池。在这两种情况下,上下文都被适当地设置
注意池对象的方法只能由创建池的进程调用
因此,您实际上不需要导入和使用,因为默认情况下使用系统中的CPU数量:
from multiprocessing import Pool
def f(x):
return x
if __name__ == '__main__':
with Pool() as p:
print(p.map(f, list(range(10))))
然而,同样的结果也可以通过写“一行”来实现:
我将pool
p
映射到函数f()
,以防您想做的事情比为索引赋值更复杂。按照错误消息,嵌套函数不能被pickle,您应该在模块的顶层定义辅助函数。只有当您理解了它使用的所有术语时,错误消息才会清楚。@problemofficer谢谢您的建议,我已经更新了。
from multiprocessing import Pool
def f(x):
return x
if __name__ == '__main__':
with Pool() as p:
print(p.map(f, list(range(10))))
print(list(range(10)))