这是我的代码片段:
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
答案 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搜索错误消息来学习它。永远是谷歌的东西。