2017-09-14 3 views
0

다중 처리 목적으로 함수를 사용하고 싶습니다. 피클 할 수 없습니다. 내가 코드를 실행할 때, 나는 오류를 얻을copy_reg 만 사용하여 피클 링하는 방법

from multiprocessing import Pool 

def g(x): 
    def g1(y): 
    return x*y 
    return g1 

if __name__ == "__main__": 
    f=g(5) 
    Pool(2).map(f,[2,3]) 

: 다음과 같은 코드가 근본적으로 보이는거야 내가 copy_reg이 문제를 해결할 수 있습니다 읽었습니다

File "<stdin>", line 1, in <module> 
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get 
    raise self._value 
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup 
    __builtin__.function failed 

을하지만, 예를 혼동 나를. 또한 그들 중 일부는 marshal과 같은 추가 패키지를 사용합니다. 가능한 경우 누군가 copy_reg만을 사용하여 간단한 수정을 제공 할 수 있습니까?

답변

0

정확히이 목적으로 copy_reg를 사용할 수 없습니다. copy_reg.pickle()은 유형 및 함수를 인수로 취하고 그 함수를 사용하여 해당 유형의 객체를 pickle합니다. 즉, 주어진 클래스에서 생성 된 산세 객체에 사용할 함수를 정의하는 데 사용할 수 있습니다. 다음은 문서의 예입니다.

>>> import copy_reg, copy, pickle 
>>> class C(object): 
...  def __init__(self, a): 
...   self.a = a 
... 
>>> def pickle_c(c): 
...  print("pickling a C instance...") 
...  return C, (c.a,) 
... 
>>> copy_reg.pickle(C, pickle_c) 
>>> c = C(1) 
>>> d = copy.copy(c) 
pickling a C instance... 
>>> p = pickle.dumps(c) 
pickling a C instance... 

두려워하지 마십시오. 해결하려는 문제는 이미 해결책이 있습니다. pathos라는 라이브러리가 있습니다. 여기에는 ProcessingPool이라는 클래스가 포함되어 있습니다.

pip install -U pathos 

이제 대신 mulitprocessing.Pool

from pathos.multiprocessing import ProcessingPool 

def g(x): 
    return lambda y: print(x*y) 

if __name__ == '__main__': 
    f = g(5) 
    ProcessingPool(2).map(f, [2, 3]) 
+0

쿨, 비애의 비애를 사용할 수 있습니다 : 당신은 이것을 명령 줄을 입력해야합니다. 감사! – user3433489

관련 문제