为什么为什么巧不巧并发.futures.ThreadPoolExecutor()。submit返回?

时间:2018-07-24 15:46:14

标签: 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

submit为什么不立即返回?我要做些什么才能改变呢?

1 个答案:

答案 0 :(得分:3)

使用with语句等效于调用executor.shutdown()which is documented like this

  

shutdown(wait=True)

     

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

     

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

     

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

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