Я пытаюсь запустить несколько 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 не (кажется) не позволяет мне передавать дополнительные аргументы (и использование лямбда для этого не будет работать, потому что лямбда не может быть распределена).
Итак, теперь я пытаюсь заставить работу работать с помощью 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'>, ())
Если я вижу хотя бы один из них, процесс родительского процесса зависает вечно, не пожимая детей и не выходя из него.