【发布时间】:2013-02-25 04:32:52
【问题描述】:
我正在尝试在多个文件上并行运行一些 python 代码。构造基本上是:
def process_file(filename, foo, bar, baz=biz):
# do stuff that may fail and cause exception
if __name__ == '__main__':
# setup code setting parameters foo, bar, and 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() 来让事情正常工作。我的问题是代码似乎挂起并且永远不会退出。一些文件因异常而失败,但我不明白为什么会导致连接失败/挂起?有趣的是,如果没有一个文件因异常而失败,它确实会干净地退出。
我错过了什么?
编辑:当函数(以及工作程序)失败时,我看到了这个异常:
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)', <class 'subprocess.CalledProcessError'>, ())
如果我看到其中之一,进程父进程将永远挂起,永远不会收获子进程并退出。
【问题讨论】:
-
您的代码似乎运行良好,即使我在
process_file中抛出随机异常。因此,这可能与您在process_file中实际所做的事情有关,这导致了问题。 -
嗯。什么版本的python?我是2.7的。实际程序中的 process_file 相当复杂,大量使用 PIL、NetworkX、poly2tri 和其他库。我知道至少有两个地方我知道在某些情况下可能导致异常的错误,但我需要简单地忽略这些错误并继续前进。我很困惑为什么它永远不会为我退出,而是为你工作。
-
2.7.2,这是我测试过的:gist.github.com/robertklep/5125319
-
这看起来确实是一个合理的测试用例,它在我的系统上也运行良好。现在我完全迷路了。
-
我也刚看到这个:bugs.python.org/issue9400