(我为此找到了一个不错的解决方案here,但不幸的是我正在使用IronPython,它没有实现mutliprocessing模块...)
驾驶脚本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中,我希望能够对2个Worker.py实例输出的两个字典进行操作。
涉及Queue模块的已接受答案here似乎是我在访问返回值方面所需要的,但这是从单个脚本。如何使Worker.py中调用的函数的返回值可用于Threader.py(或任何其他脚本)?
非常感谢
答案 0 :(得分: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()
编辑:
类似的事情是使用你自己的线程来执行目标函数并保存它的返回值,如下所示:
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()