【问题标题】:ThreadPoolExecutor with context manager带有上下文管理器的 ThreadPoolExecutor
【发布时间】:2018-02-09 11:37:11
【问题描述】:

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

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

你能解释一下吗?

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")

from concurrent.futures import ThreadPoolExecutor

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

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

【问题讨论】:

    标签: python multithreading threadpoolexecutor


    【解决方案1】:

    您的第一个程序没有明确关闭池。您使用executor.submit() 提交您的任务,这是一个非阻塞调用。您的主程序立即处理打印语句并挂在那里,直到所有线程在 19 秒后完成。

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 太棒了!谢谢:)
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多