Python-将多重处理与多个参数一起使用不起作用

时间:2019-10-16 12:12:01

标签: python python-3.x python-multiprocessing

我正在尝试使用具有多个arg的多重处理来打印伪值,但这似乎不起作用。我收到错误

"f() missing 2 required positional arguments:..."

对于以下代码:

from multiprocessing import Pool

class tryProcessing:
    def f(self, arr, arg1, arg2):
        print(arr + " " + arg1 + " " + arg2)

    def func(self, arr, arg1, arg2):
        arg1 = "hi"
        arg2 = "hello"
        arr_a = ['1','2']
        arr_b = ['3','4','5']
        p = Pool(Processes=2)
        p.map(self.f, [[a, arg1, arg2], [b, arg1, arg2]])
        p.close

我在做什么错了?

P.s。 in this answer,他做了类似的事情,我不明白为什么他的作品,而我的却没有。

3 个答案:

答案 0 :(得分:1)

您传递了一个参数,这是一个完整的列表。


test = map(lambda x : x, [[a, arg1, arg2], [b, arg1, arg2]]) 
print(next(test)) 

您可以像这样更新您的功能。


def f(self, *args):
    arr, arg1, arg2 = args
    print(f"{arr} {arg1} {arg2}")

答案 1 :(得分:1)

您正在寻找starmap,它期望迭代器包含参数的嵌套迭代器,并将其扩展为函数参数。它使用星号(splat)表示法进行扩展,因此得名。

P.S。您永远不会在函数末尾真正调用p.close

答案 2 :(得分:0)

与您在其中发布链接的解决方案相比,您的方法有很多区别。

  • 通知位置参数def someaction(a, b=1, c=2, d=3)
  • 而且您没有位置参数def f(self, arr, arg1, arg2)

这也许可以解释您遇到的错误。 调整您的代码可以正常工作

from multiprocessing import Pool

class tryProcessing:
    def f(self, arr):
        print(arr)

    def func(self, arr, arg1, arg2):
        arg1 = "hi"
        arg2 = "hello"
        arr_a = ['1','2']
        arr_b = ['3','4','5']
        p = Pool(2)

        data = [["a1", "b1", "c1", "d1"],
        ["a2", "b2", "c2", "d2"],
        ["a3", "b3", "c3", "d3"], ]

        p.map( self.f, data)
        p.close

t = tryProcessing()
t.func("adfasf", "dfaf", "daf")