如何在后台线程或进程中有效使用 PyJulia 或其他非线程安全库?
How to effectively use PyJulia or other non-thread-safe libraries in a background thread or process?
我的 Python 应用程序中有一个场景,我有一些工作需要在后台完成,但采用即发即弃的方式。我试图满足两个限制条件:
- 后台任务使用 PyJulia,它是 not thread-safe 如果从同一进程中的两个不同线程调用它将会失败,即使这些调用没有同时发生。
- 事实证明,在给定进程中第一次调用 PyJulia 时,它也有一些繁重的工作要做。在执行 Julia 代码之前需要几秒钟的时间进行初始化。我不想每次调用都付这个费用
处理这种情况最简单的方法是什么?我想象我必须创建一个长期存在的工作线程或进程,我可以不断地向其排队任务,但如果不需要,我不想编写自定义代码来处理所有这些。
我找到的最简单的解决方案是使用 Python 的 multiprocessing.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 不会阻塞主执行线程,并且始终在同一个 "background" 进程(以及同一个线程)中运行。显然 apply_async
也为该进程排队工作,因为我可以多次调用它并且任务按顺序执行。
如果有必要,使用 multiprocessing
工具启用从该进程到主应用程序的通信也不难。
我的 Python 应用程序中有一个场景,我有一些工作需要在后台完成,但采用即发即弃的方式。我试图满足两个限制条件:
- 后台任务使用 PyJulia,它是 not thread-safe 如果从同一进程中的两个不同线程调用它将会失败,即使这些调用没有同时发生。
- 事实证明,在给定进程中第一次调用 PyJulia 时,它也有一些繁重的工作要做。在执行 Julia 代码之前需要几秒钟的时间进行初始化。我不想每次调用都付这个费用
处理这种情况最简单的方法是什么?我想象我必须创建一个长期存在的工作线程或进程,我可以不断地向其排队任务,但如果不需要,我不想编写自定义代码来处理所有这些。
我找到的最简单的解决方案是使用 Python 的 multiprocessing.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 不会阻塞主执行线程,并且始终在同一个 "background" 进程(以及同一个线程)中运行。显然 apply_async
也为该进程排队工作,因为我可以多次调用它并且任务按顺序执行。
如果有必要,使用 multiprocessing
工具启用从该进程到主应用程序的通信也不难。