Python 多处理脚本似乎没有错误地冻结

Mic*_*ael 4 python multiprocessing python-2.7 ubuntu-12.04

我正在尝试使用该multiprocessingmyfunc并行调用一个函数(让我们称之为),特别是使用pool.mapie 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()
Run Code Online (Sandbox Code Playgroud)

更新 使用多处理时的一个问题可能是对象的大小,如果您认为这可能是一个问题,请参阅此答案。正如答案指出的那样“如果这个 [解决方案] 不起作用,那么您从函数中返回的东西可能是不可腌制的,因此无法正确地通过队列。” 多处理通过酸洗对象在进程之间传递对象。事实证明,我的一两个对象有汤BeautifulSoup ,不会腌制

vic*_*ick 5

检查是否所有进程都启动了。这将有助于您调试它。另外在代码末尾添加 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
Run Code Online (Sandbox Code Playgroud)