Ich verwende concurrent.futures.ProcessPoolExecutor, um mehrere Instanzen von Code gleichzeitig auszuführen. Während des Laufens möchte ich die Instanzen überwachen. Ich benutze die future.running() und future.done() Funktionen dafür. Ich schrieb ein minimales Beispiel:Der Status von concurrent.futures spiegelt nicht seinen wahren Status wider.
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)
Das beginnt 6 Arbeitsplätze und legt sie in die PoolExecutor, die auf zwei Aufträge gleichzeitig arbeiten können. Sobald ich foo beginnen, ist es das, was ich auf der Konsole:
| Job Running | Job Running | Job Running | Job Running | Job Running | Job Running
Dies zeigt an, dass alle Prozesse auf einmal ausgeführt werden. Ich denke, nur zwei von ihnen sollten sofort laufen. Was mache ich falsch?