나는 꽤 오랫동안 사용되지 않았지만 이미 사용되어 잘 작동 한 프로그램이 있습니다. 여러 데이터에 대해 동일한 작업을 여러 번 수행해야하므로 다중 처리가 사용됩니다.프로그램은 map()과 함께 작동하지만 pool.map()을 사용하여 TypeError를 발생시킵니다.
이제 새 매개 변수를 추가하는 프로그램을 만져서 테스트 한 결과 오류가 있음을 알았습니다. 또한 이전 (버전 제어) 버전도 동일한 오류가 발생합니다. 전체 오류는 다음과 같습니다.
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 764, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
TypeError: 'NoneType' object is not callable
그게 전부입니다. 그것은 솔직히 말해서 나에게별로 말하지 않습니다. 이것을 디버깅하는 동안 풀 버전 pool.map
대신 일반 map()
을 사용하려고했습니다. 스크립트가 정상적으로 실행됩니다.
내가 오류를 재현 최소한의 예를, 가지고 올 수는 없지만, 내가 기대했던대로 모든 것이 잘 작동 예를 들어, 가지고 올 수 :
import random
import time
from multiprocessing import Pool
def do_work(x, y, z):
time.sleep(random.random() * 2)
print x + y + z
def do_one(arguments):
print "doing one"
do_work(*arguments)
def do_many(x, y, zs):
map(do_one, [(x, y, z) for z in zs])
def do_many_pooled(x, y, zs):
pool = Pool(2)
pool.map(do_one, [(x, y, z) for z in zs])
pool.close()
pool.join()
def main():
x = 1
y = 2
zs = range(10)
print "doing many"
do_many(x, y, zs)
print "doing many pooled"
do_many_pooled(x, y, zs)
if __name__ == '__main__':
main()
실제 프로그램을 많이하지 데이터베이스 요청, numpy를 사용한 계산 및 결과를 다시 데이터베이스에 저장. 실제 프로그램에서 풀링 된 버전과 함께 사용할 때는 "one one"을 인쇄하기 전에 오류없이 프로그램이 종료되지만 풀링되지 않은 버전을 사용하면 문제없이 실행됩니다.
누군가가 어떻게 트레이스 백을 올바르게 읽는 지, 그리고/또는이 예외를 유발할 수있는 원인을 알 수 있습니까?
[map_async] (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map_async)를 사용하고 [AsyncResult] (https : // docs .python.org/2/library/multiprocessing.html # multiprocessing.pool.AsyncResult) 예외를 재발견하기위한'get' 메소드와 더 많은 정보를 찾을 수 있을까요? – NoamG
어떤 버전의 파이썬을 사용하고 있습니까? 파이썬 2.7. 뭐라구? – jszakmeister
@tobias_k 예, 100 % 확신합니다. 본문에서 언급했듯이이 예제에서는 오류를 재현 할 수 없으며 최소한의 예제로 오류를 재현하는 데 필요한 것이 무엇인지 알지 못합니다. – Nras