0

これが私の質問です:「特定のタスクのグループが終了したとき、終了したばかりのグループに応じて他のタスクを開始できるようになるとき」を知るための最良かつよりスマートな方法は何ですか

たとえば、私はこのツリーを持っているので、A が終了したら、H と B などを開始できます...しかし、次の小さなツリーでは、終了したと見なされる各文字が特定のタスクを実行する必要があることも知っておく必要があります (これも並行して) )

           A
         /   \
       H       B
     /        /  \
   C         F     D 

したがって、完全な例は次のようになります。

- Starting A
     - Starting instance 1 of A
     - Starting instance 2 of A
     - Starting instance 3 of A
     - Instance 1 of A Finished
     - Instance 2 of A Finished
     - Instance 3 of A Finished

- Starting H
- Starting B
     - Starting instance 1 of H
     - Starting instance 2 of H
     - Starting instance 1 of B
     - Starting instance 3 of H
     - B has completed all its tasks
- Starting F
     - Starting instance 4 of H
     - H has completed all its tasks
- Starting C
etc...

私の質問を再開するには、たとえば A のすべてのタスクが終了して B と H を開始できるようになるのを待つのに最適な構造はどれでしょうか?

今のところこれは、コールバックhttp://www.chrisarndt.de/projects/threadpool/を使用して、特定のクリスチャンの lib スレッド プールに基づいて私が行っていることです 。

文字ごとに、完了するタスクの数があるので、そのような辞書を作成しました

instances_count = {"A":[0,5],"B":[0,2],"H":[0,3],"C":[0,0],"D":[0,1]}

そのような私の最初の要求を行います

requests = threadpool.makeRequests(do_something, ["A"],print_result)

do_something が終了すると print_result が呼び出されます

def do_something(data):

    Here I just retrieve what the Tasks of A and make an other request to parallelize them

   command_requests = threadpool.makeRequests(execute_command, argument_list,instance_finished)


def execute_command(data):
   Here I Do what the task has to do and when it is done i return the datas
   return data

def instance_finished():
    And here what I do is that I will use that instance_count to add +1 when A task reletated to a Letter finishes...

   Global.Lock()
   instances_count[Letter][0] = instances_count[Letter][0] + 1
   Global.unLock()

そして、instances_count[Letter][0] == instances_count[Letter][1] かどうかを確認します。これは、A のすべてのタスクが終了し、文字 B と H を「開始」できることを意味します。

それで、これが良い解決策かどうか誰か教えてもらえますか? いいえの場合、どうすれば改善できますか?

ありがとうございました !

4

1 に答える 1

0

Mutltiprocessing モジュールを使用することをお勧めします

ワーカー プールをセットアップし、apply_asyncマッピング関数または同様の関数を使用してタスクを追加します。

apply_asyncオブジェクトを返しAsyncResultます。AsyncResultオブジェクトには次のメソッドがあります。

待機([タイムアウト])

結果が得られるまで、または timeout 秒が経過するまで待ちます。

準備()

呼び出しが完了したかどうかを返します。

上記のリンクにすべてあります.. 頑張ってください。

于 2013-01-13T18:51:36.847 に答える