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多线程具有这种行为的原因是什么?
concurrent.futures.Executor在with语句中使用 a相当于Executor.shutdown使用后调用——导致执行器等待所有任务完成。一个Executor在用with的并行任务的保证正确关闭即使内部发生错误with块。
Executor.shutdown ( wait=True )
当当前挂起的期货完成执行时,通知执行器它应该释放它正在使用的任何资源。关闭后调用
Executor.submit()和Executor.map()将引发RuntimeError.[...]
如果您使用该
with语句,则可以避免必须显式调用此方法 ,这将关闭Executor(等待就像是Executor.shutdown()在调用时将wait设置为True): [...]
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |