2017-09-17 4 views
0

다음 코드가 예상대로 실행되지 않습니다.중첩 된 함수에서 다중 처리 풀이 작동하지 않습니다.

import multiprocessing 

lock = multiprocessing.Lock() 
def dummy(): 
    def log_results_l1(results): 
     lock.acquire() 
     print("Writing results", results) 
     lock.release() 

    def mp_execute_instance_l1(cmd): 
     print(cmd) 
     return cmd 

    cmds = [x for x in range(10)] 

    pool = multiprocessing.Pool(processes=8) 

    for c in cmds: 
     pool.apply_async(mp_execute_instance_l1, args=(c,), callback=log_results_l1) 

    pool.close() 
    pool.join() 
    print("done") 


dummy() 

그러나 함수가 중첩되어 있지 않으면 작동합니다. 무슨 일 이니?

+0

'잠금'의 유형은 무엇입니까? –

+0

미래에 대해서는 문제가 문맥에서 충분히 분명해졌지만 "작동하지 않는다"고 말할 수는 없습니다. [MCVE]를 제공해야하며이 경우 실패시 발생하는 오류 및 예외 추적이 포함됩니다. – ShadowRanger

+0

예, 감사합니다. – kanna

답변

1

multiprocessing은 함수와 인수를 모두 pickle 처리해야합니다. 함수는 정규화 된 이름으로 절인됩니다. 근본적으로, unpickling에, 다른 프로세스는 그들이 정의 된 모듈을 가져올 수 있어야하고 질문에 함수를 찾기 위해 getattr 호출을 할 수 있어야합니다. 중첩 된 함수는 정의 된 함수 외부에서 이름으로 사용할 수 없기 때문에 산세가 실패합니다. 함수를 전역 범위로 이동하면이 문제가 해결되므로이 작업을 수행 할 때 작동합니다.