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

Python 如何在后台线程或进程中有效地使用PyJulia或其他非线程安全库?,python,julia,python-multiprocessing,python-multithreading,fire-and-forget,Python,Julia,Python Multiprocessing,Python Multithreading,Fire And Forget,在我的Python应用程序中有一个场景,我有一些工作需要在后台完成,但要以一种火而忘的方式完成。我试图满足两个约束条件: 后台任务使用PyJulia,如果在同一进程中从两个不同的线程调用它,即使这些调用不是同时发生的,也会失败 事实证明,PyJulia在给定进程中第一次被调用时也有一些繁重的工作要做。在执行Julia代码之前,初始化需要几秒钟的时间。我不想每次打电话都付这个费用 处理这种情况最简单的方法是什么?我想象我必须创建一个长期工作线程或进程,我可以不断地将任务排队,但如果不需要的话,

在我的Python应用程序中有一个场景,我有一些工作需要在后台完成,但要以一种火而忘的方式完成。我试图满足两个约束条件:

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

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

这是我找到的最简单的解决方案,可以满足我的需要,就是使用Python的
multiprocessing.Pool
来创建一个只包含一个进程的池,在我的应用程序的生命周期中保留该进程池,并使用
apply_async
在该进程池上以一种火而忘却的方式执行任务:

来自多处理导入池的

...
类别MyClass:
定义初始化(自):
self.process\u pool=None
定义我的任务(self,arg1,arg2):
...
def运行(自身、arg1、arg2):
如果不是self.process\u池:
self.process\u pool=pool(进程=1)
self.process\u pool.apply\u async(self.my\u pyjulia\u task,(arg1,arg2))
这确保PyJulia不会阻塞主执行线程,并且始终在同一“后台”进程(以及同一线程)中运行。显然,
apply\u async
也会对该进程的工作进行排队,因为我可以多次调用它,并且任务是按顺序执行的


如果有必要的话,使用
多处理工具来实现从这个过程到主应用程序的通信也不难。

考虑到Python中的GIL lock,这似乎是您能做的最好的事情。除非您决定重新设计从Julia调用Python,这更方便、更可扩展:-)谢谢您的评论。是的,我不喜欢这样,我必须考虑像这样的东西运行在哪个后台线程上。