Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 期货的状态并没有反映其真实状态_Python_Concurrency - Fatal编程技术网

Python 期货的状态并没有反映其真实状态

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

我正在使用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) 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()
,尽管只有一个任务在实际执行