如何在后台线程或进程中有效地使用PyJulia或其他非线程安全的库?

问题描述 投票:0回答:1

在我的Python应用程序中,我有一个场景,其中我有一些工作需要在后台完成,但是是以fire-and-forget的方式。我试图满足两个约束条件。

  • 后台任务使用PyJulia,它是... 不安全 并在同一进程的两个不同线程中被调用时失败,即使这些调用不是同时发生的。
  • 事实证明,PyJulia在第一次被给定进程调用时,也有一些繁重的工作要做。在Julia代码被执行之前,需要几秒钟的时间来初始化。我不想每次调用它时都要付出这个代价。

处理这样的情况,最简单的方法是什么?我想象我必须创建一个单一的长寿命的工作线程或进程,我可以不断地向其排队执行任务,但如果没有必要,我不想写自定义代码来处理这一切。

python julia python-multiprocessing python-multithreading fire-and-forget
1个回答
1
投票

我找到的最简单的解决方案,能满足我的需求,就是使用 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 工具,以便在必要时,能够从这个过程中与主应用程序进行通信。

© www.soinside.com 2019 - 2024. All rights reserved.