2017-03-05 1 views

답변

1

ThreadPoolExecutor.map을 제대로 사용하지 않았기 때문입니다. 인수는 하나의 반복자로 전달되어서는 안하지만 3 반복자로 : 또한

from concurrent import futures 
from itertools import repeat 
from multiprocessing import cpu_count 


def do_stuff(a, b, c): 
    print(a, b, c) 


def run_executor(a, b, l): 
    with futures.ThreadPoolExecutor(max_workers=cpu_count() - 1) as e: 
     e.map(do_stuff, repeat(a), repeat(b), c) 

, 당신은 이상한 행동을 방지하기 위해 기본 스크립트에서 if __name__ == "__main__" 보호를 사용해야합니다. 이렇게 정의 된 함수를 임포트/피클 링하려고하면 모듈 메인이 실행되지 않도록 보호 할 수 있습니다.

import other 

if __name__ == "__main__": 
    a = [1, 2, 3] 
    b = ['a', 'b'] 
    l = ['a', 'b', 'd'] 

    other.run_executor(a, b, l) 
+0

감사합니다. 그러나. 다시 말하지만, 나는 그것을 메인 모듈에 묶을 수 없다 ... 다른 모듈로부터 호출되어야한다 (보호가 없다). '이상한 행동'이란 무엇입니까? 내가 다른 질문에서 말했듯이; 내 전체 프로그램은 다음과 같습니다 : main.py 프로세스를 시작합니다. 매개 변수화가 호출 된 후 에이전트가로드되거나 생성 된 다음 시간 반복 모듈이 발생합니다. 시간 반복은'do_stuff()'가 필요한 곳에서 running_month를 호출합니다. 그 위에, 여러 시뮬레이션에서 나는'main.py'를 100 번 호출한다. 요약하면, 이벤트 순서는 do_stuff를'if __name__ == '안에 넣지 못하도록한다. __main __'' –

+1

유일한 제약 조건은 당신이 여러 개의 근로자 풀을 만들고 싶지 않습니다. 모듈을 가져 오면 함수가 아닌 모든 코드가 즉시 실행됩니다. 따라서 코드를 생성하는 과정이 스크립트에 직접있는 경우 오류 또는 의도하지 않은 동작이 발생할 수 있습니다. 스크립트'main.py'를 여러 번 실행하지 말고 가져올 수 있고 계산을 처리하는'main()'함수를 생성해야합니다. 스크립트 대신에 함수를 만들면'if main'과 같은 안전 가드를 가질 수 있습니다. –

+0

좋아요. 우수한! –

관련 문제