我尝试使用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()
答案 0 :(得分:1)
由于任务失败,因此未调用示例中的回调。对于每个任务:error_callback
,将调用TypeError
和foo_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
时只需要一个参数。
将self
和result
包装在数据结构中,例如一个元组...
self.result_list.append((self, result))
...或完全跳过附加self
。最后,这将永远是您的MultiThread
实例:
self.result_list.append(result)
MultiThread
这个名字容易引起误解。您的类包装了一个进程池,而不是线程池。