【发布时间】:2019-10-28 10:35:54
【问题描述】:
在 Python 的 concurrent.futures 标准模块中,为什么 ProcessPoolExecutor 中的运行调用数是 max_workers + 1 而不是像 ThreadPoolExecutor 中的 max_workers?仅当提交的调用数量严格大于池工作进程的数量时才会发生这种情况。
以下 Python 代码 sn-p 向 ProcessPoolExecutor 中的 2 个工作人员提交 8 个调用:
import concurrent.futures
import time
def call():
while True:
time.sleep(1)
if __name__ == "__main__":
with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
futures = [executor.submit(call) for _ in range(8)]
time.sleep(5)
for future in futures:
print(future.running())
打印这个(3 个正在运行的调用;意外,因为有 2 个工作人员):
正确
真的
真的
假的
假的
假的
假的
假的
在使用 ThreadPoolExecutor 时会打印此信息(2 个正在运行的调用;预期):
正确
真的
假的
假的
假的
假的
假的
假的
【问题讨论】:
-
可能的情况是进程启动(这需要时间)和状态之间存在竞争条件,而使用线程时速度会快得多。我的意思是:一旦第一个返回 True,它就可以再次为 False。状态快照不是原子的。
-
@Jean-FrançoisFabre 我尝试在两者之间使用
time.sleep(3),但没有区别。 -
在轮询运行状态更改数字之前使用
sleep。我之前有 1 个,现在我有 5 个...... -
如果您在调用中添加一些打印,您会看到只有 2 个进程正在运行。运行状态可能不可靠。
-
@Jean-FrançoisFabre 所以你认为
Future.running方法坏了?
标签: python concurrency future process-pool