Python - 如何使用Pool map传递多个参数

时间:2016-09-28 23:16:37

标签: python multiprocessing

这是我的代码片段:

data = [currentAccount.login,currentAccount.password,campaign.titlesFile,campaign.licLocFile,campaign.subCity,campaign.bodiesMainFile,campaign.bodiesKeywordsFile,campaign.bodiesIntroFile]
results = multiprocessing.Pool(5).map(partial(self.postAd,data),range(3))
...
def postAd (self,login,password,titlesFile,licLocFile,subCity,bodiesMainFile,bodiesKeywordsFile,bodiesIntroFile):
...

(只是让你知道发生了什么:currentAccount和campaign是类,那些是这些类中的变量。使用self b / c这都是在一个类中运行。我试图尝试运行self.postAd 3x传递我在数据中的所有变量

当我跑的时候它会说" postAd()缺少6个必要的位置参数:' titlesFile',' licLocFile',' subCity',' bodiesMainFile',' bodiesKeywordsFile& #39;和' bodiesIntroFile'"

我做错了什么?为什么它只接受2个变量?

如果我不能使用Pool地图,我该怎么做呢?

我也试过这个没有成功:

results = multiprocessing.Pool(5).map(lambda args: self.postAd(currentAccount.login,currentAccount.password,campaign.titlesFile,campaign.licLocFile,campaign.subCity,campaign.bodiesMainFile,campaign.bodiesKeywordsFile,campaign.bodiesIntroFile), range(3))

Error: Can't pickle <function NewPostService.processNewAds.<locals>.<lambda> at 0x0000000002F3CBF8>: attribute lookup <lambda> on functions failed

1 个答案:

答案 0 :(得分:0)

您的第一次尝试是对partial的误用。 data是一个参数:它是一个列表不会自动解压缩其内容。 partial只需要变量参数,所以你应该'正常'传递这些参数,或者

partial(self.postAd, currentAccount.login,currentAccount.password, ...

partial(self.postAd, *data)

它说postAd收到两个参数而不是一个(data)的原因是它也隐式收到self参数。

你的第二次尝试是正确的想法并且非常接近,但in older versions of python pickle (which is essential for multiprocessing) can't handle lambdas恰好发生了。将lambda替换为使用def

定义的命名函数
def postNow(arg):  # Accepts an argument from map which it ignores
    self.postAd(currentAccount.login, ..., campaign.bodiesIntroFile)

附注:

当它只是一个参数时,你对lambda的参数被称为args,这有点奇怪。如果您的目的是使其灵活并接受变量参数,请使用lambda *args: ...甚至lambda *args, **kwargs: ...来接受关键字参数。这些名字并不重要,它们只是惯例。重要的部分是***。请注意,partial有一个这样的签名,作为示例。

我以前从未见过第二次尝试这个问题。我通过Google搜索错误消息来学习它。永远是谷歌的东西。