2017-02-04 1 views
3

어떤 사람은 사전에생성기 기능이있는 파이썬 다중 처리 모듈을 사용하는 중 오류가 발생했습니다.

MaybeEncodingError Traceback (most recent call last) in() 5 p = Pool(2) 6 ----> 7 n = p.map(sq, range(10))

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in map(self, func, iterable, chunksize) 258 in a list that is returned. 259 ''' --> 260 return self._map_async(func, iterable, mapstar, chunksize).get() 261 262 def starmap(self, func, iterable, chunksize=None):

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in get(self, timeout) 606 return self._value 607 else: --> 608 raise self._value 609 610 def _set(self, i, obj):

MaybeEncodingError: Error sending result: '[, ]'. Reason: 'TypeError("can't pickle generator objects",)'

많은 감사

from multiprocessing import Pool 
def sq(x): 
    yield x**2 
p = Pool(2) 

n = p.map(sq, range(10)) 

나는 점점 오전 오류 다음 아래의 코드에 어떤 문제가 있는지 설명 할 수 없습니다.

+0

방법보다 훨씬 느리다는 것을 나타내는 것으로, I는리스트를 통해 반복 강제 제가

print(list(n)) 

참고 상기와 동일한 결과를 얻을 수있는 값을 소비 (실제 프로세싱을 활성화)하기 반환 수익률 변경? – Shiping

+0

값 저장을 피하려고합니다. – Manu

+0

yield는 값을 저장하려고 시도하고 반환하면 값을 반환하고 잊어 버립니다. 그럼에도 불구하고 수익률은 효과가 없을 것입니다. – Shiping

답변

4

기능이 아닌 생성기을 사용해야합니다. 의미 : yieldreturn으로 변경하여 sq을 함수로 변경하십시오. Pool은 발전기와 함께 사용할 수 없습니다.

또한 Windows에서 작동중인 버전을 만들려고 할 때 이상한 반복 오류 메시지가 나타납니다.

from multiprocessing import Pool 

def sq(x): 
    return x**2 

if __name__=="__main__": 
    p = Pool(2) 
    n = p.map(sq, range(10)) 
    print(n) 

결과 :

the error on windows is because each process spawns a new python process which interprets the python file etc. so everything outside the "if main block" is executed again"

하기 때문에,이 모듈을 실행할 때 __name__=="__main__"를 사용할 필요가 휴대용 될 : 그것은 자명 한 이후

Attempt to start a new process before the current process 
has finished its bootstrapping phase. 

This probably means that you are on Windows and you have 
forgotten to use the proper idiom in the main module: 

if __name__ == '__main__': 

문자 그대로, 내가 가진 코멘트를 인용 :

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

편집 : 당신이 값을 저장하지 않으려면 사전에 당신은

n = p.imap(sq, range(10)) 

nimap 지금 발전기 개체입니다 사용할 수 있습니다. 문서가 imapmap

+0

값을 저장하지 않으려 고합니다. – Manu

+0

내 편집을 참조하십시오. –

+0

나는 "__name__ == '__main__'"을 시도했다. 같은 오류입니다. 나는 다른 사람들의 제안을 기다릴 것이고, 그렇지 않으면 "return"옵션을 사용할 것입니다. – Manu

관련 문제