带有上下文管理器的ThreadPoolExecutor

Mar*_*usz 3 python multithreading threadpoolexecutor

我不明白为什么这段代码的行为方式不同。在第一种情况下,代码将显示“ 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")
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

Han*_*nnu 6

您的第一个程序未明确关闭池。您使用提交任务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")
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。