2012-05-14 6 views
0

는 (나는 이것에 대한 괜찮은 솔루션 here을 찾았지만, 불행히도합니다 ... mutliprocessing 모듈을 구현하지 않는 IronPython의를 사용하고 있습니다)를 사용하여,파이썬 스레딩 : 어떻게 외부 스크립트의 반환 값을 사용합니까?

운전 스크립트 Threader.py 두 번 Worker.py의 하나의 함수 호출 스레딩 모듈. 단일 기능은 데이터 사전을 가져옵니다.

대략 말하기 :

Worker.py

def GetDict(): 
    : 
    : 
    : 
    return theDict 

드라이버 스크립트 Threader.py에서 Threader.py

import threading 
from Worker import GetDict 
    : 
    : 
    : 
def ThreadStart(): 
    t = threading.Thread(target=GetDict) 
    t.start() 
    : 
    : 

, 내가 운영 할 수 있도록하려면 Worker.py의 두 인스턴스에 의해 출력 된 두 개의 사전에서.

대기열 모듈을 포함하는 허용 대답 here 내가 반환 값을 액세스 측면에서 필요하지만,이는 단일 스크립트에서 doen되고 모든게의 관점에서 기록 된 어떤 것으로 보인다. Worker.py에서 호출 된 함수의 반환 값을 Threader.py (또는 그와 관련된 다른 스크립트)에서 사용할 수있게하려면 어떻게해야합니까?

많은 감사

+0

''subprocess' 또는'os.system'을 사용하여'Worker.py'를 시작한다는 것을 의미합니까? – ubik

+0

나는 내 질문에 감사를 표했다. 실제로 Worker.py를 시작하지는 않았다. 게다가 유일한 함수 GetDict()가 Threader.py에 의해 호출되었다. – Pyderman

답변

0

(A Queue를 사용하지 않고) 당신이 원하는 것을 할 수있는 또 다른 방법은 (이전 버전 there is a backport를 들어, python3.2에서)를 concurrent.futures 모듈을 사용하여이 될 것입니다. 이 사용

, 당신의 예는 다음과 같이 작동합니다 :

from concurrent import futures 

def GetDict(): 
    return {'foo':'bar'} 

# imports ... 
# from Worker import GetDict 

def ThreadStart(): 
    executor = futures.ThreadPoolExecutor(max_workers=4) 
    future = executor.submit(GetDict) 
    print(future.result()) # blocks until GetDict finished 

    # or doing more then one: 
    jobs = [executor.submit(GetDict) for i in range(10)] 
    for j in jobs: 
     print(j.result()) 

if __name__ == '__main__': 
    ThreadStart() 

편집 :

뭔가 비슷한 woule 대상 기능을 실행 자신의 스레드를 사용하여 저장할 수는 반환 값이 같은 뭔가 :

from threading import Thread 

def GetDict(): 
    return {'foo':'bar'} 

# imports ... 
# from Worker import GetDict 

class WorkerThread(Thread): 

    def __init__(self, fnc, *args, **kwargs): 
     super(WorkerThread, self).__init__() 
     self.fnc = fnc 
     self.args = args 
     self.kwargs = kwargs 

    def run(self): 
     self.result = self.fnc(*self.args, **self.kwargs) 


def ThreadStart(): 
    jobs = [WorkerThread(GetDict) for i in range(10)] 
    for j in jobs: 
     j.start() 
    for j in jobs: 
     j.join() 
     print(j.result) 

if __name__ == '__main__': 
    ThreadStart() 
+0

감사합니다. IronPython을 사용하고 있습니다. 나를위한 옵션입니다. – Pyderman

+0

예, 맞습니다. IronPython을 사용해 보았습니다. 'concurrent.futures.process import ProcessPoolExecutor'에서'concurrent.futures .__ init __. py' 라인을 제거함으로써 멀티 프로세싱을 지원하지 않고 작업을 시작합니다. 그들이 try/catch를 여기에 추가했다면 멋질 것입니다 ... – mata

관련 문제