Python 为什么';t concurrent.futures.ThreadPoolExecutor()。是否立即提交回报?

Python 为什么';t concurrent.futures.ThreadPoolExecutor()。是否立即提交回报?,python,concurrency,python-multithreading,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') 我希望看到: With returned Hi 但我明白了: Hi With returned 为什么

在此代码中:

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')
我希望看到:

With returned
Hi
但我明白了:

Hi
With returned

为什么
提交
不立即返回?我应该更改什么使其这样做?

使用
with
语句相当于调用
executor.shutdown()
,:

关机(等待=True)

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

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

如果使用with语句,则可以避免显式调用此方法,该语句将关闭执行器(就像在wait设置为True时调用EXCEUTOR.shutdown()一样等待)

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