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



我尝试像这个问题一样使用多线程池。但是我想将所有逻辑打包到我自己的类中,如下所示。回调函数apply_async出现问题。当我将所有逻辑打包在类中时,回调函数似乎从未被调用过。我不知道如何分配回调函数以便正确调用它。在源问题中,log_result参数中只有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()

示例中的回调不会被调用,因为任务失败。将调用一个error_callback,每个任务都有一个TypeErrorfoo_pool() takes 2 positional arguments but 3 were given

您要么必须通过将self添加为第一个参数来使foo_pool成为普通方法......

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这个名字具有误导性。您的类包装进程池,而不是线程池。

相关内容

  • 没有找到相关文章

最新更新