0

(ここでこれに対する適切な解決策を見つけましたが、残念ながら、マルチプロセッシングモジュールを実装していないIronPythonを使用しています...)

駆動スクリプトThreader.pyは、スレッドモジュールを使用してWorker.pyの単一関数を2回呼び出します。その単一の関数は、データの辞書をフェッチするだけです。

大ざっぱに言えば:

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の2つのインスタンスによって出力された2つの辞書を操作できるようにしたいと思います。

キューモジュールに関するここで受け入れられている答えは、戻り値にアクセスするという点で私が必要としているもののようですが、これは、単一のスクリプトで実行されるすべての観点から書かれています。Worker.pyで呼び出された関数の戻り値をThreader.py(またはその他のスクリプト)で利用できるようにするにはどうすればよいですか?

どうもありがとう

4

1 に答える 1

0

(を使用せずに)必要なことを行う別の方法は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 に答える