在我的Python应用程序中,我有一个场景,其中我有一些工作需要在后台完成,但是是以fire-and-forget的方式。我试图满足两个约束条件。
处理这样的情况,最简单的方法是什么?我想象我必须创建一个单一的长寿命的工作线程或进程,我可以不断地向其排队执行任务,但如果没有必要,我不想写自定义代码来处理这一切。
我找到的最简单的解决方案,能满足我的需求,就是使用 Python 的 multiprocessing.Pool
来创建一个只包含一个进程的池子,在我的应用程序的生命周期中保持这个进程池,并使用 apply_async
来在该进程池上以fire-and-forget的方式执行任务。
from multiprocessing import Pool
...
class MyClass:
def __init__(self):
self.process_pool = None
def my_pyjulia_task(self, arg1, arg2):
...
def run(self, arg1, arg2):
if not self.process_pool:
self.process_pool = Pool(processes=1)
self.process_pool.apply_async(self.my_pyjulia_task, (arg1, arg2))
这样可以确保PyJulia不会阻塞主执行线程,并始终在同一个 "后台 "进程中运行(也是同一个线程)。显然 apply_async
也为该进程排队工作,因为我可以多次调用它,任务按顺序执行。
这也不难,因为我可以多次调用它,并按顺序执行任务。multiprocessing
工具,以便在必要时,能够从这个过程中与主应用程序进行通信。