2012-05-14 62 views
0

(我發現這是一個體面的解決辦法here,但不幸的是我使用IronPython的不落實mutliprocessing模塊...)Python線程:如何使用外部腳本的返回值?

駕駛腳本Threader.py將調用Worker.py的功能單一的兩倍,使用線程模塊。它的單個函數只是提取一個數據字典。

粗略地說:

Worker.py

def GetDict(): 
    : 
    : 
    : 
    return theDict 

Threader.py

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

在驅動程序的腳本Threader.py,我希望能夠運行由Worker.py的兩個實例輸出的兩個字典。

接受的答案here涉及隊列模塊似乎是什麼,我需要在訪問返回值的計算,但這但從寄託都點寫在腳本被DOEN。我如何着手將Worker.py中調用的函數的返回值提供給Threader.py(或其他任何腳本)?

非常感謝

+0

你的意思是說你使用'subprocess'或'os.system'啓動'Worker.py'嗎? – ubik

+0

我已經重寫了我的問題,謝謝 - 我實際上並沒有啓動Worker.py,而且它的唯一函數GetDict()被Threader.py調用 – Pyderman

回答

0

另一種方式做你想做的(不使用Queue)將通過使用concurrent.futures模塊(來自python3.2,早期版本there is a backport)。

用這個,你的例子會工作是這樣的:

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,所以既不是這個也不是backport是我的選擇。 – Pyderman

+0

是的,你說得對,我現在用IronPython試了一下。還可以通過在'concurrent.futures .__ init __。py'中刪除'from concurrent.futures.process import ProcessPoolExecutor'這行來開始工作,而不需要多處理支持。如果他們在這裏添加了try/catch,那將是非常棒的... – mata