我想在multiprocessing
模块中使用对象方法的返回值。从文档中我认为这可以通过multiprocessing.pool.AsyncResult.get
来实现。
但相反,在我的情况下会抛出错误,而通常应该返回一个整数值。
下面是一个最小示例:
import multiprocessing as mp
from random import randrange
class Model():
def __init__(self):
self.rno = randrange(100)
def solve(self, *args, **kwargs):
print(args, kwargs)
return self.rno
if __name__ == '__main__':
# sample data
models = [Model() for m in range(0, 10)]
args = [1, 2]
kwds = {'foo': 3, 'bar': 4}
# execution
pool = mp.Pool(processes=mp.cpu_count())
for m in models:
result = pool.apply_async(m.solve(*args, **kwds))
print(result.get())
pool.close()
pool.join()
而不是传递对象的属性rno
result.get()
抛出错误TypeError: 'int' object is not callable
。
有什么提示吗?我在这里错过了什么?
提前感谢您的帮助!
PS:请注意,在我的实际应用程序中,该方法的返回值solve()
提供另一种数据类型,而结构会动态变化。但看起来如果我通常错过了一些东西..
我自己找到了解决方案!
错误是我已将方法的结果传递给池,而不是函数本身。
下面是一个工作示例:
import multiprocessing as mp
from random import randrange
class Model():
def __init__(self):
self.rno = randrange(100)
def solve(self, *args, **kwargs):
print(args, kwargs)
return [self.rno, args, kwargs]
if __name__ == '__main__':
# sample data
models = [Model() for m in range(0, 10)]
args = [1, 2]
kwds = {'foo': 3, 'bar': 4}
pool = mp.Pool(processes=mp.cpu_count())
for m in models:
result = pool.apply_async(m.solve, args=args, kwds=kwds)
print(result.get())
pool.close()
pool.join()
很抱歉打扰您..