2017-06-30 21 views
2

私はconcurrent.futures.ProcessPoolExecutorを使用してコードのいくつかのインスタンスを一度に実行しています。走っている間、私はインスタンスを監視したい。私はfuture.running()とfuture.done()関数を使っています。私は、最小限の例を書いた:concurrent.futuresの状態が実際の状態を反映していない

def dummy_solver(i): 
    sleep(random()*5) 
    return i 

def foo(): 
    with concurrent.futures.ProcessPoolExecutor(max_workers=2) as pool: 
     number_of_jobs = 6 
     futures = [None] * number_of_jobs 
     for job_number in range(len(futures)): 
      futures[job_number] = pool.submit(dummy_solver, job_number) 
     while True: 
      msg = "" 
      for future in futures: 
       if future.running() is True: 
        part_msg = "Job Running  " 
       if future.done() is True: 
        part_msg = "Job Done, Result:" + str(future.result()) 
       msg = msg + " | " + part_msg 
      print("\r" + msg, end="") 
      sleep(1) 

これは6つのジョブを起動し、一度に2つのジョブ上で動作することができますPoolExecutorにそれらを置きます。できるだけ早く私がfooを開始するように、これは私がコンソール上に得るものです:

| Job Running  | Job Running  | Job Running  | Job Running  | Job Running  | Job Running  

これは、すべてのプロセスが同時に実行されていることを示しています。私はそれらのうちの2つだけが一度に動くべきだと思う。私は間違って何をしていますか?

答えて

2

はここでスタートだ:

 for future in futures: 

ループの最初のステートメントとして(あなたが一番好きか何でもMSG)

  part_msg = "" 

追加します。現時点では、part_msgではなく、各ループ反復でがリセットされるため、future.running()でもfuture.done()も真でない場合、part_msgは以前の反復での値を保持します。

ここでも細かいことがあります:.running()は、未来が内部の機械に十分に届いているかどうかを本当に報告しています。だから、たぶんmax_workers未来が彼らが「走っている」と報告するという保証はない。これは、リリースによって異なる内部実装の詳細によって異なります。通常、ワーカープロセスがタスクを開始すると、メインプログラムのマシンは、ワーカーが使用可能になるのを待つ別のタスクもエンキューします。その時点で、両方のタスクはrunning()を報告します。

関連する問題