0

(我在这里找到了一个不错的解决方案,但不幸的是我使用的是 IronPython,它没有实现多处理模块......)

驱动脚本 Threader.py 会调用 Worker.py 的单个函数两次,使用 threading 模块。它的单一功能只是获取数据字典。

粗略地讲:

工人.py

def GetDict():
    :
    :
    :
    return theDict

线程器.py

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

在驱动脚本 Threader.py 中,我希望能够对 Worker.py 的 2 个实例输出的两个字典进行操作。

这里接受的涉及 Queue 模块的答案似乎是我在访问返回值方面所需要的,但这是从在单个脚本中完成的所有事情的角度编写的。如何使 Worker.py 中调用的函数的返回值可用于 Threader.py(或任何其他脚本)?

非常感谢

4

1 回答 1

0

另一种做你想做的事(不使用 a Queue)的方法是使用concurrent.futures模块(来自 python3.2,对于早期版本,有一个 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()
于 2012-05-14T10:01:44.303 回答