栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用并发超时功能?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用并发超时功能?

据我所知,TimeoutError实际上是在您期望的时间引发的,而不是在任务完成之后引发的。

但是,您的程序本身将继续运行,直到完成所有正在运行的任务。这是因为当前正在执行的任务(在您的情况下,可能是所有已提交的任务,因为您的池大小等于任务数)实际上并未被“杀死”。

引发TimeoutError,以便您可以选择不等到任务完成(而是执行其他操作),但是任务将继续运行直到完成。只要执行器的线程/子进程中有未完成的任务,python就不会退出。

据我所知,不可能仅“停止”当前正在执行的期货,而只能“取消”尚未开始的计划任务。在您的情况下,将没有任何东西,但是假设您有5个线程/进程的池,并且您想处理100个项目。在某个时候,可能有20个完成的任务,5个正在运行的任务和75个计划的任务。在这种情况下,您可以取消这76个计划的任务,但是无论您是否等待结果,正在运行的4个任务将一直持续到完成。

即使无法做到这一点,我想也应该有一些方法来达到您期望的最终结果。也许此版本可以在途中为您提供帮助(不确定其功能是否完全符合您的要求,但可能有一定用处):

import concurrent.futuresimport timeimport datetimemax_numbers = [10000000, 10000000, 10000000, 10000000, 10000000]class Task:    def __init__(self, max_number):        self.max_number = max_number        self.interrupt_requested = False    def __call__(self):        print("Started:", datetime.datetime.now(), self.max_number)        last_number = 0;        for i in xrange(1, self.max_number + 1): if self.interrupt_requested:     print("Interrupted at", i)     break last_number = i * i        print("Reached the end")        return last_number    def interrupt(self):        self.interrupt_requested = Truedef main():    with concurrent.futures.ThreadPoolExecutor(max_workers=len(max_numbers)) as executor:        tasks = [Task(num) for num in max_numbers]        for task, future in [(i, executor.submit(i)) for i in tasks]: try:     print(future.result(timeout=1)) except concurrent.futures.TimeoutError:     print("this took too long...")     task.interrupt()if __name__ == '__main__':    main()

通过为每个“任务”创建一个可调用对象,并将其提供给执行器,而不仅仅是简单的函数,您可以提供一种“中断”任务的方法。提示:删除

task.interrupt()
一行,看看会发生什么,这可能会使您更容易理解我在上面的详细解释;-)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624830.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号