带有上下文管理器的ThreadPoolExecutor

时间:2018-02-09 11:37:12

标签: python multithreading threadpoolexecutor

我不明白为什么这段代码的行为方式不同。在第一种情况下,代码将打印'elo',19秒后我们将看到'3'。

在其他情况下,我们将首先等待19秒,然后我们将看到'elo'。

你可以解释一下吗?

base

VS

from concurrent.futures import ThreadPoolExecutor

def wait_on_future():
    f = 3
    import time
    time.sleep(19)
    print(f)

executor = ThreadPoolExecutor(max_workers=2)
executor.submit(wait_on_future)
print("elo")

1 个答案:

答案 0 :(得分:5)

您的第一个程序未明确关闭池。您使用executor.submit()提交任务,这是一项非阻止通话。你的主程序立即处理打印语句,然后挂起,直到所有线程在19秒后完成。

您的第二个程序使用with语句,在此上下文中是阻塞。 with ThreadPoolExecutor()有一个隐式shutdown(wait=True),它会阻塞,直到所有线程都完成处理。见https://docs.python.org/3/library/concurrent.futures.html

这使您的program1在功能上与您的程序2相同:

executor = ThreadPoolExecutor(max_workers=2)
executor.submit(wait_on_future)
executor.shutdown(wait=True)
print("elo")

希望这会有所帮助。