여러 파일에 대해 파이썬 코드를 병렬로 실행하려고합니다. 내가 이전에 비슷한 일을 할 pool.map을 사용했습니다 그것은 큰 일조인 할 때 파이썬 다중 처리 풀이 중단됩니까?
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가 (에 표시)하지 않기 때문에이 여기에 사용할 수없는 것 : 구축물은 기본적으로 (그리고 람다를 정렬 할 수 없기 때문에 람다를 사용하면 작동하지 않을 것입니다).
이제 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'에서 실제로하고있는 것과 관련이 있습니다. – robertklep
허. 파이썬 버전은 무엇입니까? 나는 2.7에있어. 실제 프로그램의 process_file은 매우 복잡하여 PIL, NetworkX, poly2tri 및 기타 라이브러리를 많이 사용합니다. 어떤 경우에는 예외가 발생할 수있는 버그를 알고있는 곳이 적어도 2 곳은 알고 있지만, 단순히 오류를 무시하고 계속 진행해야합니다. 나는 그것이 결코 나를 위해 나가지 않을 것이지만 당신을 위해 일하는 것에 관해서 난처한 상태입니다. – clemej
2.7.2 이것은 다음과 같이 테스트 한 내용입니다. https://gist.github.com/robertklep/5125319 – robertklep