我正在尝试使用具有多个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,他做了类似的事情,我不明白为什么他的作品,而我的却没有。
答案 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")