我正在尝试制作一个Python“ JobQueue”,该Python“ JobQueue”在本地计算机上异步执行计算密集型任务,其机制将每个任务的结果返回给主进程。 Python的multiprocessing.Pool
具有一个apply_async()
函数,该函数通过接受任意函数,其多个参数以及返回结果的回调函数来满足这些要求。例如...
import multiprocessing
pool = multiprocessing.Pool(poolsize)
pool.apply_async(func, args=args,
callback=mycallback,
error_callback=myerror_callback)
唯一的问题是,赋予apply_async()
的函数必须可以用Pickle 序列化,而我需要同时运行的函数却不能。仅供参考,原因是,目标函数是包含IDL对象的对象的成员,例如:
from idlpy import IDL
self.idl_obj = IDL.obj_new('ImageProcessingEngine')
这是在pool.apply_async()
行收到的错误消息:
'Can't pickle local object 'IDL.__init__.<locals>.run''
我尝试过的事情
我做了一个JobQueue
的简单实现(见下文),在Job
对象和run()
方法是可腌制的(在下面的示例)。很棒的是,主进程可以通过回调函数接收异步执行函数返回的任意数量的数据。
我尝试使用pathos.pools.ProcessPool
,因为它使用dill
而不是pickle
。但是,它没有类似于apply_async()
的方法。我想重构JobQueue.add()
来解决此序列化问题。
是否还有其他选项,或使用dill
或通过其他方式提供此功能的第三方库?
答案 0 :(得分:0)
如何创建一个将IDL端点实例化为function static variable的存根函数?
请注意,这仅是代码的草图,因为从问题中很难说出是要将IDL对象作为参数传递给并行运行的函数还是它有其他用途。
def stub_fun(paramset):
if 'idl_obj' not in dir(stub_fun): # instantiate once
stub_fun.idl_obj = IDL.obj_new('ImageProcessingEngine')
return stub_fun.idl_obj(paramset)