我尝试像这个问题一样使用多线程池。但是我想将所有逻辑打包到我自己的类中,如下所示。回调函数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
这个名字具有误导性。您的类包装进程池,而不是线程池。