`concurrent.futures`中`with`的函数

guy*_*345 6 python multithreading python-multithreading python-3.x

下面的代码通过将总完成时间返回几乎为零来按预期执行,因为它不会等待线程完成每个作业。

import concurrent.futures
import time

start = time.perf_counter()


def do_something(seconds):
    print(f'Sleeping {seconds} second(s)...')
    time.sleep(seconds)
    return f'Done Sleeping...{seconds}'



executor= concurrent.futures.ThreadPoolExecutor()
secs = [10, 4, 3, 2, 1]

fs = [executor.submit(do_something, sec) for sec in secs]


finish = time.perf_counter()

print(f'Finished in {round(finish-start, 2)} second(s)')
Run Code Online (Sandbox Code Playgroud)

但是使用with命令它确实等待:

with concurrent.futures.ThreadPoolExecutor() as executor:
    secs = [10, 4, 3, 2, 1]

    fs = [executor.submit(do_something, sec) for sec in secs]
Run Code Online (Sandbox Code Playgroud)

为什么?with多线程具有这种行为的原因是什么?

Mis*_*agi 6

concurrent.futures.Executorwith语句中使用 a相当于Executor.shutdown使用后调用——导致执行器等待所有任务完成。一个Executor在用with的并行任务的保证正确关闭即使内部发生错误with块。

Executor.shutdown ( wait=True )

当当前挂起的期货完成执行时,通知执行器它应该释放它正在使用的任何资源。关闭后调用Executor.submit()Executor.map()将引发RuntimeError.

[...]

如果您使用该with语句,则可以避免必须显式调用此方法 ,这将关闭Executor(等待就像是 Executor.shutdown()在调用时将wait设置为True): [...]