![](/img/trans.png)
[英]error_callback in multiprocessing.Pool apply_async in Python 2?
[英]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
帶有兩個參數,而只使用一個。
包裝self
並result
數據結構,例如元組...
self.result_list.append((self, result))
...或跳過將self
附加在一起。 最后,這將始終是您的MultiThread
實例:
self.result_list.append(result)
順便提一下, MultiThread
這個名字是令人誤解的。 您的類包裝了一個進程池,而不是線程池。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.