如何使用python多处理池apply_async函数在自己的类中分配回调

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

标签: python parameters callback multiprocessing

我尝试使用this问题中的多线程池。但是我想将所有逻辑打包到我自己的类中,如下所示。问题发生在apply_async回调函数中。当我将所有逻辑打包在类中时,似乎永远不会调用回调函数。我不知道如何分配回调函数,以便将其正确调用。在源代码问题中,result参数中只有log_result,但是我必须添加其他self参数。

import numpy 
import pandas as pd 
import multiprocessing as mp 
from multiprocessing import freeze_support

class MutliThread() :
    def __init__(self):
        self.result_list = []

    def foo_pool(index, number):
        data = []
        notFound = []
        try :        
            data.append(index + number)
        except Exception:
            notFound.append(index + number)    
        return data

    def log_result(self, result):
        # This is called whenever foo_pool(i) returns a result.
        # result_list is modified only by the main process, not the pool workers.
        self.result_list.append(self, result)

    def apply_async_with_callback(self):
        pool = mp.Pool()
        data = [1,2,3,4,5,6]
        for index, tarrif in enumerate(data) :
            pool.apply_async(self.foo_pool, args = (index, tarrif), callback = self.log_result)
        pool.close()
        pool.join()
        print(self.result_list)

if __name__ == '__main__':
    freeze_support()
    multiThread = MutliThread()
    multiThread.apply_async_with_callback()

1 个答案:

答案 0 :(得分:1)

由于任务失败,因此未调用示例中的回调。对于每个任务:error_callback,将调用TypeErrorfoo_pool() takes 2 positional arguments but 3 were given

您必须通过添加foo_pool作为第一个参数来使self成为常规方法...

def foo_pool(self, index, number):

...或用@staticmethod装饰:

@staticmethod
def foo_pool(index, number):

修复此问题将导致log_result失败,因为您用两个参数调用list.append时只需要一个参数。

selfresult包装在数据结构中,例如一个元组...

self.result_list.append((self, result))

...或完全跳过附加self。最后,这将永远是您的MultiThread实例:

self.result_list.append(result)


MultiThread这个名字容易引起误解。您的类包装了一个进程池,而不是线程池。