Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多重加工中的酸洗_Python_Parallel Processing_Multiprocessing_Pickle_Joblib - Fatal编程技术网

Python 多重加工中的酸洗

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

以下代码的目标只是用0到9填充数组:

在尝试调用函数中的多进程时,出现pickle错误:

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)))