我使用concurrent.futures.ProcessPoolExecutor一次运行多个代码实例。在runnning我想监视实例。我使用future.running()和future.done()函数。我写了一个最小的例子:
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个作业并将它们放入PoolExecutor,它可以同时处理2个作业。一旦我开始foo,这就是我在控制台上得到的结果:
| Job Running | Job Running | Job Running | Job Running | Job Running | Job Running
这表示所有进程都在同时运行。我想其中只有两个应该一次运行。我做错了什么?
答案 0 :(得分:2)
这是一个开始:添加
part_msg = ""
(或者你最喜欢的任何信息)作为
中的第一个语句 for future in futures:
环。按原样,part_msg
在每次循环迭代时不重置,因此如果future.running()
和future.done()
都不为真,则part_msg
只保留值在之前的迭代中有过。
这里还有一个微妙之处:.running()
实际上是在报道未来是否已经在内部机制中得到足够的进展,以至于其执行不再被取消。因此,无法保证最多max_workers
期货会报告它们“正在运行”。这取决于内部实现细节,这些细节可能因版本而异。通常,当工作进程启动任务时,主程序中的机器也会将另一个任务排队等待工作人员变为可用,并且此时两个任务都报告running()
,尽管其中只有一个实际执行。 / p>