2013-05-21 5 views
2

다중 처리를 사용하는 맵의 간단한 예제가 있습니다. 그러나 이것조차도 정확하게 달릴 수는 없습니다.다중 처리 맵이 예외를 발생시킵니다.

Exception in thread Thread-3: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 808, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 761, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks 
    put(task) 
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

을 및 Ctrl + C로 종료 할 수 없습니다 :

import multiprocessing 

p = multiprocessing.Pool() 

rere = range(50) 
print p.map(lambda x: x+1, rere) 

이이 예외를 인쇄합니다.

내가보기에 문제를 해결하려면 어떻게해야합니까? 당신이 그것을하려고하는

방법 ... 멀티의 이상한 세계로 내 연구에서, 그래서

+0

참으로, 나는 총을 유감스럽게 생각합니다. 그것은 multiprocessing.pool.map이 작동하는 방식과 관련이 있습니다.'lambda x : x + 1' 부분은 함수가 아니라 피클 할 수 있어야합니다. 우리 모두가 더 많은 실험을해야합니다! – TehTris

+2

http://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error?rq=1 거의 똑같은 내용을 확인하십시오 – TehTris

+0

모듈에서 최상위 레벨로 함수를 선언하는 이유는 다음과 같습니다. AttributeError : 'module'객체에는 'f'속성이 없습니다 (물론 내 함수는 f라고하며 어떤 이유로 든 존재하지 않는다고 주장합니다). – LtWorf

답변

1

OK는 충분하지 않습니다. 어떻게 내가 그걸 해낼 수 있었는지 Heres.

import multiprocessing as mp 
import time 

def theGenerator(): 
    for number in xrange(10): 
     yield number 

def processNumber(x): 
    return x*2 

def multiprocessThings(): 
    pool = mp.Pool() 
    gen = theGenerator() 
    result = pool.map(processNumber, gen) 
    print result 

if __name__ == "__main__": 
    multiprocessThings() 
    time.sleep(10) 

어디서나 저장하고 두 번 클릭하십시오.

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

분명히 이런 유형의 항목은 어떤 이유로 인터프리터에서 작동하지 않습니다.

+0

감사합니다,이 하나의 작품! (그리고 두 번 클릭하지 마십시오, 나는 커맨드 라인을 사용합니다). – LtWorf

+0

문제가 없습니다! 나도 여기서 배웠어^_ ^. 그것의 sorta barebones-ish 그래서 당신이 원하는 것은 무엇이든 그것을 수정하는 것은 너무 많은 일이되어서는 안됩니다. – TehTris

+0

방금 ​​알아 낸 또 다른 한 가지는 .... 중요한 것은 무엇이든지 (내 예제에서는'processNumber()') 그것이 TOP 수준인지 확인하는 것이다. 어떤 이유로 그것은 매우 중요합니다. – TehTris

관련 문제