我正在尝试使用 multiprocessing
包并行调用一个函数(我们称之为 myfunc
),特别是使用 pool.map
即 pool.map(myfunc, myarglist)
。当我在不使用 myarglist
的情况下简单地循环 multiprocessing
时,没有错误,应该是这种情况,因为 myfunc
中的所有操作都是在 try
块中调用的。但是,当我使用 pool.map
调用该函数时,脚本总是会停止运行,即它停止打印“myfunc done!”我的函数中的语句和进程停止使用 CPU,但它永远不会返回 resultlist
。我从 ubuntu 12.04 的终端运行 python 2.7。什么可能导致这种情况发生,我应该如何修复/排除问题?
cpu_count = int(multiprocessing.cpu_count())
pool = Pool(processes = cpu_count)
resultlist = pool.map(myfunc, myarglist)
pool.close()
更新
使用多处理时的一个问题可能是对象的大小,如果您认为这可能是一个问题,请参阅此 answer 。正如答案指出的那样“如果这个 [解决方案] 不起作用,那么您从函数中返回的东西可能是不可腌制的,因此无法正确地通过队列。”多处理通过酸洗对象在进程之间传递对象。事实证明,我的一两个对象有来自
BeautifulSoup
that would not pickle 的汤。 最佳答案
检查是否所有进程都启动了。这将有助于您调试它。另外在代码末尾添加 Pool.join()。
这是一个示例代码
def start_process():
print 'Starting', multiprocessing.current_process().name
if __name__ == '__main__':
pool_size =2
pool = multiprocessing.Pool(processes=pool_size,
initializer=start_process,
)
pool_outputs = pool.map(function_name,argument_list)
pool.close() # no more tasks
pool.join() # wrap up current tasks
关于Python 多处理脚本似乎没有错误地卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24537379/