为了账号安全,请及时绑定邮箱和手机立即绑定

我可以触发并忘记提交到线程池的可调用对象吗?

我可以触发并忘记提交到线程池的可调用对象吗?

慕田峪4524236 2023-08-15 16:49:10
在我的 Python 3 应用程序中,我必须处理许多不应阻塞主线程的小型(同时)I/O 任务,因此我想利用线程池:from concurrent.futures import ThreadPoolExecutorclass MyApp:    def __init__(self):        self.app_thread_pool = ThreadPoolExecutor()    def submit_task(self, task):        self.app_thread_pool.submit(MyApp.task_runner, task)    @staticmethod    def task_runner(task):        # Do some stuff with the task, save to disk, etc.这工作正常,作业正在线程池的线程中提交和启动,任务执行它们应该执行的操作。现在,阅读该concurrent.futures模块的文档,似乎该模块/线程池将与Future对象一起使用,以便处理提交任务的结果。然而,就我而言,我对这些结果不感兴趣,我想解雇并忘记我的任务,他们能够处理自己。所以我的问题是:我是否必须使用 futures,或者我可以简单地执行submit()一个任务,如上所示,并忽略Future从作业提交返回的任何对象?我问的是内存和资源管理方面。请注意,我也不想使用该with语句来使用线程池,如文档中所述,因为我在应用程序的整个生命周期中都需要这个线程池,并且启动线程池的主线程还有许多其他事情要做...
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

不,您当然不必使用返回的Future对象。正如您所发现的,您的代码似乎可以在不这样做的情况下正常工作。这只是可观察性稳健性的问题。

保留Futures 可以让您跟踪已提交的任务。您可以了解他们何时完成、检索结果、取消任务等。这对于了解任务的进展情况非常重要。

但密切关注任务的一个可以说更重要的原因是为了稳健性。如果其中一项任务失败怎么办?您可能想以某种方式重试。请注意,很少有任务不会失败。你说你的任务是“I/O”,这是一个失败很常见的典型例子,只有在你尝试了一些东西之后才知道

因此,虽然没有什么强迫您跟踪未来,但您可能应该这样做,特别是如果您需要一个强大的、长期运行的应用程序。


查看完整回答
反对 回复 2023-08-15
  • 1 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信