0

我想在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()提供了另一种数据类型,而结构是动态变化的。但看起来我是否通常会遗漏一些东西..

4

1 回答 1

1

我自己找到了解决方案!

错误是我已将方法的结果传递给池,而不是函数本身。

这是一个工作示例:

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()

对不起,打扰你..

于 2020-01-11T14:27:08.777 回答