1

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

"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

我究竟做错了什么?

Ps在这个答案中,他做了类似的事情,我不明白为什么他的作品,而我的没有。

4

3 回答 3

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}")
于 2019-10-16T12:21:03.163 回答
1

您正在寻找starmap,它期望可迭代包含要扩展为函数参数的嵌套可迭代参数。它使用星号(splat)符号来扩展,因此得名。

PS你从来没有p.close在你的函数结束时真正调用过。

于 2019-10-16T12:26:56.090 回答
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")
于 2019-10-16T12:43:45.187 回答