다중 처리 모듈 및 산세.산세 및 다중 처리
더 잘 이해하고 싶은 멀티 프로세싱 모듈을 사용해야 할 때마다 약간의 산패가 진행되는 것 같습니다.
분명히 항목을 (어떤 이유로 든) 절취 할 수없는 경우, 다중 처리 모듈의 Process 또는 Pool 개체에 인수로 전달할 수 없습니다. 왜 이런거야?
절품 불가 품목에 대한 전체 목록이나 설명이 있습니까?
도움을 주실 수있는 분들께 감사드립니다.
다중 처리 모듈 및 산세.산세 및 다중 처리
더 잘 이해하고 싶은 멀티 프로세싱 모듈을 사용해야 할 때마다 약간의 산패가 진행되는 것 같습니다.
분명히 항목을 (어떤 이유로 든) 절취 할 수없는 경우, 다중 처리 모듈의 Process 또는 Pool 개체에 인수로 전달할 수 없습니다. 왜 이런거야?
절품 불가 품목에 대한 전체 목록이나 설명이 있습니까?
도움을 주실 수있는 분들께 감사드립니다.
그래서 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
직렬화 할 수 있습니다.
여기 pathos
및 dill
받기 : https://github.com/uqfoundation
http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma?rq=1 – elyase