2015-01-04 4 views
0

다중 처리 모듈 및 산세.산세 및 다중 처리

더 잘 이해하고 싶은 멀티 프로세싱 모듈을 사용해야 할 때마다 약간의 산패가 진행되는 것 같습니다.

분명히 항목을 (어떤 이유로 든) 절취 할 수없는 경우, 다중 처리 모듈의 Process 또는 Pool 개체에 인수로 전달할 수 없습니다. 왜 이런거야?

절품 불가 품목에 대한 전체 목록이나 설명이 있습니까?

도움을 주실 수있는 분들께 감사드립니다.

+0

http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma?rq=1 – elyase

답변

1

그래서 pickle은 매우 쉽게 직렬화 할 수 있습니다. 전체 목록은 docs ..에서 꽤 많이 주어진다. 여기 : https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled 그리고 여기 : https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled.

악화됩니다. 실제로는 pickle이 주로 참조로 직렬화되기 때문에 산 염해는 통역사에서 실제로 작동하지 않습니다. 당신은 기본적으로 다음 인터프리터에서 당신이 당신의 함수, 클래스를 구축 한 경우, 그래서

>>> import pickle 
>>> import math 
>>> pickle.dumps(math.sin) 
'cmath\nsin\np0\n.' 

, 또는 무엇이든 : 그것은 실제로 함수 또는 클래스 객체를 피클하지 않습니다, 그것은 본질적으로 자신의 이름 문자열을 직렬화 pickle으로 피클을 칠할 수 없습니다. __main__ 모듈을 찾고 pickle__main__을 찾을 수 없습니다. 또한 인터프리터에서 multiprocessing을 사용하여 직렬화하지 못할 수도 있습니다.

그러나 좋은 해결책이 있습니다. 더 나은 시리얼 라이저 (예 : dill)와 더 나은 시리얼 라이저를 사용하는 multiprocessing의 포크를 사용할 수 있습니다.

>>> import dill 
>>> from pathos.multiprocessing import ProcessingPool as Pool 
>>> p = Pool() 
>>> 
>>> def squared(x): 
... return x**2 
... 
>>> dill.dumps(squared) 
'\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01Ufc\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x08\x00\x00\x00|\x00\x00d\x01\x00\x13S(\x02\x00\x00\x00Ni\x02\x00\x00\x00(\x00\x00\x00\x00(\x01\x00\x00\x00t\x01\x00\x00\x00x(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x07\x00\x00\x00squared\x01\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x02\x85q\x03Rq\x04c__builtin__\n__main__\nU\x07squaredq\x05NN}q\x06tq\x07Rq\x08.' 
>>> 
>>> p.map(squared, range(10)) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 
>>> 

직렬화 할 수 있는지에 대한 종류의 괜찮은 목록이 그리고 무슨 일이 수 없습니다 : https://github.com/uqfoundation/dill/blob/master/dill/_objects.py - 그것은 포괄적 아니지만, 대부분의 일들이 dill 직렬화 할 수 있습니다.

여기 pathosdill 받기 : https://github.com/uqfoundation