Python 期货的状态并没有反映其真实状态
我正在使用concurrent.futures.ProcessPoolExecutor一次运行多个代码实例。在运行时,我希望监视实例。为此,我使用future.running()和future.done()函数。我写了一个简单的例子:Python 期货的状态并没有反映其真实状态,python,concurrency,Python,Concurrency,我正在使用concurrent.futures.ProcessPoolExecutor一次运行多个代码实例。在运行时,我希望监视实例。为此,我使用future.running()和future.done()函数。我写了一个简单的例子: def dummy_solver(i): sleep(random()*5) return i def foo(): with concurrent.futures.ProcessPoolExecutor(max_workers=2) a
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中,PoolExecutor可以同时处理2个作业。我一启动foo,控制台上就会显示以下内容:
| Job Running | Job Running | Job Running | Job Running | Job Running | Job Running
这表示所有进程同时运行。我认为他们中只有两个人应该同时跑。我做错了什么?这里有一个开始:添加
part_msg = ""
(或任何你最喜欢的信息)作为
for future in futures:
循环。同样地,part\u msg
不会在每次循环迭代中重置,因此如果future.running()
和future.done()
都不是真的,那么part\u msg
只会保留它在上一次迭代中的值
这里还有一个微妙之处:.running()
实际上是在报告未来在内部机制中是否已经走得足够远,以至于它的执行无法再取消。因此,不能保证最多有max_工人
futures会报告他们正在“运行”。这取决于内部实现细节,这些细节可能因版本而异。通常,当辅助进程启动一个任务时,主程序中的机器还会将另一个任务排队等待辅助进程可用,此时两个任务都报告running()
,尽管只有一个任务在实际执行