我正在尝试使用 multiprocessing 包并行调用一个函数(我们称之为 myfunc ),特别是使用 pool.mappool.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/

10-14 18:10