我可以触发并忘记提交给线程池的可调用对象吗?
Can I fire & forget callables submitted to a thread pool?
在我的 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
语句使用线程池,如文档中所述,因为我在应用程序的整个生命周期内都需要这个线程池,并且启动线程池的主线程有许多其他事情要做...
不,您当然没有使用返回的Future
对象。正如您所发现的,您的代码似乎可以在不这样做的情况下正常工作。这只是可观察性和稳健性的问题。
保留 Future
可以让您跟踪已提交的任务。您可以了解他们何时完成、检索他们的结果、取消它们等。这对于了解您的任务正在发生什么很重要。
但可以说,密切关注任务的一个更重要的原因是为了稳健性。如果其中一项任务失败怎么办?您可能想以某种方式重试。请注意,很少有 不能 失败的任务。你说你的任务是“I/O”,这是一个失败很常见的典型例子,只有在你尝试之后才知道。
因此,虽然没有什么强迫你跟踪未来,但你可能应该,特别是如果你需要一个健壮的, long-running申请。
在我的 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
语句使用线程池,如文档中所述,因为我在应用程序的整个生命周期内都需要这个线程池,并且启动线程池的主线程有许多其他事情要做...
不,您当然没有使用返回的Future
对象。正如您所发现的,您的代码似乎可以在不这样做的情况下正常工作。这只是可观察性和稳健性的问题。
保留 Future
可以让您跟踪已提交的任务。您可以了解他们何时完成、检索他们的结果、取消它们等。这对于了解您的任务正在发生什么很重要。
但可以说,密切关注任务的一个更重要的原因是为了稳健性。如果其中一项任务失败怎么办?您可能想以某种方式重试。请注意,很少有 不能 失败的任务。你说你的任务是“I/O”,这是一个失败很常见的典型例子,只有在你尝试之后才知道。
因此,虽然没有什么强迫你跟踪未来,但你可能应该,特别是如果你需要一个健壮的, long-running申请。