首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`concurrent.futures`中的“`with`”函数

`concurrent.futures`中的“`with`”函数
EN

Stack Overflow用户
提问于 2020-05-30 16:12:24
回答 1查看 705关注 0票数 6

下面的代码按预期执行,将总完成时间返回几乎为零,因为它不会等待线程完成每一项任务。

代码语言:javascript
复制
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)')

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

代码语言:javascript
复制
with concurrent.futures.ThreadPoolExecutor() as executor:
    secs = [10, 4, 3, 2, 1]

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-30 16:27:29

concurrent.futures没有被很好地记录下来。当您创建一个执行器时,必须关闭它来终止它的线程或进程。该代码将通过向线程推送None命令来指示线程退出,然后等待它们完成。在第一个例子中,如果添加了executor.shutdown(),就会看到延迟。它就在那里-程序还是用了10秒才退出的。

执行器可以用作上下文管理器(它作为__enter____exit__方法)。当它退出"with“块时,将调用__exit__,然后它将为您执行shutdown调用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62105222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档