【问题标题】:Can I fire & forget callables submitted to a thread pool?我可以触发并忘记提交到线程池的可调用对象吗?
【发布时间】:2021-01-04 11:53:23
【问题描述】:

在我的 Python 3 应用程序中,我必须处理许多不应阻塞主线程的小型(同时)I/O 任务,因此我想利用线程池:

from concurrent.futures import ThreadPoolExecutor

class 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.

这工作正常,作业正在线程池的线程中提交和启动,任务执行它们应该执行的操作。现在,阅读documentation on the concurrent.futures module,似乎这个模块/线程池将与Future 对象一起使用,以处理提交任务的结果。然而,就我而言,我对这些结果不感兴趣,我想解雇并忘记我的任务,他们能够自己处理。

所以我的问题是:我是否必须使用期货,或者我可以简单地submit() 一个任务,如上所示,而忽略从作业提交返回的任何Future 对象?我问的是内存和资源管理。请注意,我也不想使用 with 语句来使用线程池,如文档中所述,因为我在应用程序的整个生命周期中都需要这个线程池,并且启动线程池的主线程还有很多其他的要做的事情...

【问题讨论】:

    标签: python multithreading memory-management threadpool


    【解决方案1】:

    不,当然你没有使用返回的Future 对象。正如您所发现的,如果不这样做,您的代码似乎可以正常工作。这只是可观察性鲁棒性的问题。

    保留Futures 允许您跟踪提交的任务。您可以了解他们何时完成、检索他们的结果、取消他们等。这对于了解您的任务正在发生什么很重要。

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

    因此,虽然没有什么强迫您跟踪未来,但您可能应该,尤其是当您需要一个健壮、长期运行的应用程序时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2021-12-13
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多