concurrent.futures的状态并未反映其真实状态

时间:2017-06-30 15:15:58

标签: python concurrency

我使用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       

这表示所有进程都在同时运行。我想其中只有两个应该一次运行。我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是一个开始:添加

           part_msg = ""

(或者你最喜欢的任何信息)作为

中的第一个语句
      for future in futures:

环。按原样,part_msg在每次循环迭代时重置,因此如果future.running()future.done()都不为真,则part_msg只保留值在之前的迭代中有过。

这里还有一个微妙之处:.running()实际上是在报道未来是否已经在内部机制中得到足够的进展,以至于其执行不再被取消。因此,无法保证最多max_workers期货会报告它们“正在运行”。这取决于内部实现细节,这些细节可能因版本而异。通常,当工作进程启动任务时,主程序中的机器也会将另一个任务排队等待工作人员变为可用,并且此时两个任务都报告running(),尽管其中只有一个实际执行。 / p>