Python多进程池在join时卡住了?
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)',, ())
如果我看到其中一个异常,父进程将永远挂起,无法回收子进程并退出。