Python多进程池在join时卡住了?

12 浏览
0 Comments

Python多进程池在join时卡住了?

我试图并行运行一些Python代码来处理多个文件。基本的结构如下:

def process_file(filename, foo, bar, baz=biz):
    # 一些可能会失败并引发异常的操作
if __name__ == '__main__':
    # 设置参数 foo、bar 和 biz 的代码
    psize = multiprocessing.cpu_count()*2
    pool = multiprocessing.Pool(processes=psize)
    map(lambda x: pool.apply_async(process_file, (x, foo, bar), dict(baz=biz)), sys.argv[1:])
    pool.close()
    pool.join()

我以前使用过pool.map来完成类似的操作,效果很好,但是在这里似乎无法使用它,因为pool.map不允许我传入额外的参数(使用lambda来传递也行不通,因为lambda无法被序列化)。

所以现在我尝试直接使用apply_async()来使事情正常运行。我的问题是代码似乎一直挂起而无法退出。其中一些文件会引发异常,但我不明白为什么会导致join失败/挂起?有趣的是,如果没有任何文件引发异常,它会正常退出。

我漏掉了什么吗?

编辑:当函数(及其工作进程)失败时,我看到以下异常:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 376, in _handle_results
    task = get()
TypeError: ('__init__() takes at least 3 arguments (1 given)', , ())

如果我看到其中一个异常,父进程将永远挂起,无法回收子进程并退出。

0