如何在Python中创建异步多处理JobQueue?

时间:2019-06-13 01:15:16

标签: python-3.x pickle python-multiprocessing dill pathos

我正在尝试制作一个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或通过其他方式提供此功能的第三方库?

1 个答案:

答案 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)