为什么 concurrent.futures.ThreadPoolExecutor().submit 不立即返回?

Sco*_*ter 4 python concurrency python-multithreading

在这段代码中:

import concurrent.futures
import time

def pafter(t):
    time.sleep(t)
    print('Hi')

with concurrent.futures.ThreadPoolExecutor(5) as e:
    e.submit(pafter, 2)

print('With returned')
Run Code Online (Sandbox Code Playgroud)

我希望看到:

With returned
Hi
Run Code Online (Sandbox Code Playgroud)

但我看到:

Hi
With returned
Run Code Online (Sandbox Code Playgroud)

为什么不submit立即返回?我要改变什么才能让它这样做?

dan*_*ano 6

使用该with语句相当于调用executor.shutdown()其记录如下

shutdown(wait=True)

当当前挂起的期货完成执行时,通知执行器它应该释放它正在使用的任何资源。关闭后调用 Executor.submit() 和 Executor.map() 将引发 RuntimeError。

如果 wait 为 True 则此方法将不会返回,直到所有挂起的期货都执行完毕并且与执行程序关联的资源已被释放。如果 wait 为 False,则此方法将立即返回,并且当所有挂起的期货执行完毕后,将释放与执行程序关联的资源。不管wait的值是多少,在所有挂起的future执行完成之前,整个Python程序都不会退出。

如果您使用 with 语句,您可以避免显式调用此方法,这将关闭 Executor(等待,就好像 Executor.shutdown() 是在等待设置为 True 的情况下调用的)

粗体部分解释了您所看到的行为;在submit()调用并立即返回,但with语句将阻塞,直到所有提交的工作就完成了。要更改它,您不需要使用该with语句,而是显式调用shutdown(wait=False).