2

我在我的 Python 应用程序中有一个场景,我有一些工作需要在后台完成,但是以一种即发即弃的方式。我试图满足两个限制条件:

  • 后台任务使用 PyJulia,它不是线程安全的,如果从同一个进程中的两个不同线程调用它会失败,即使这些调用不会同时发生。
  • 事实证明,在给定进程中第一次调用 PyJulia 时,它还有一些繁重的工作要做。在执行 Julia 代码之前需要几秒钟的时间进行初始化。我不想每次打电话都支付这笔费用。

处理这种情况的最简单方法是什么?我想我必须创建一个长寿命的工作线程或进程,我可以不断地将任务排队到其中,但如果我不需要,我不想编写自定义代码来处理所有这些。

4

1 回答 1

3

我发现满足我需求的最简单的解决方案是使用 Pythonmultiprocessing.Pool创建一个只包含一个进程的池,在我的应用程序的生命周期内保留该进程池,并用于apply_async在该进程池上执行任务以一种即发即弃的方式:

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如果有必要的话,使用工具来实现从这个进程到主应用程序的通信也不难。

于 2020-05-10T13:15:33.593 回答