为什么并发.futures的submit()不能立即将控制权返回给主程序?

我正在学习concurrent.futures(从threading迁移过来),但我无法理解提交和等待工作的精确程度。

考虑以下代码,有两个线程开始,其中一个线程应该立即完成,而另一个线程无限期挂起。

我的期望是两个线程都将通过submit()凝视,并且控件将立即交还给主程序。

在此之后,具有超时的wait()将返回一个元组donenot_done线程(not_done将是一个被超时强行中断的线程)。 / p>

import concurrent.futures
import time

def worker(wait_infinite):
    if wait_infinite:
        time.sleep(100)

with concurrent.futures.ThreadPoolExecutor() as executor:
    inf = executor.submit(worker,True)
    not_inf = executor.submit(worker,False)

res = concurrent.futures.wait([inf,not_inf],timeout=2)
print(res)

发生的情况是执行挂起在not_inf = executor.submit(worker,False)上。 为什么不将控制权交还给主程序?

lxcgo 回答:为什么并发.futures的submit()不能立即将控制权返回给主程序?

在with语句执行器的末尾调用executor.shutdown。等待所有线程完成。您应该将wait移至with语句中,然后调用executor.shutdown(False)以停止在挂起的线程上等待。(编辑:除非合作,否则您无法正确取消正在运行的线程或是否处于其他过程https://stackoverflow.com/a/55351671/7284763

source

  

executor.shutdown(wait = True)

     

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

     

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

     

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

本文链接:https://www.f2er.com/3137449.html

大家都在问