簡體   English   中英

如何使用python多處理池apply_async函數在自己的類中分配回調

[英]How to assign callback inside own class using python multiprocessing pool apply_async function

我試圖在問題中使用多線程池。 但是我想將所有邏輯打包到我自己的類中,如下所示。 該問題發生在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將與被稱為TypeError的每一個的任務: foo_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這個名字是令人誤解的。 您的類包裝了一個進程池,而不是線程池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM