2016-09-28 29 views
0

這是我的代碼sniplet多個參數:Python的 - 我如何可以通過使用泳池地圖

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和運動是類,這些都是變數使用self b/c這是所有運行在一個類中我試圖運行self.postAd 3x通過它所有我有數據的變量)

當我運行它說「postAd()失蹤6個需要的位置參數:'titlesFile','licLocFile','subCity','bodiesMainFile','bodiesKeywordsFile'和'bodiesIntroFile'「

我做錯了什麼?爲什麼它只接受2個變量?

如果我不能使用游泳池地圖,我應該怎麼做?

我還沒有成功嘗試這樣做:

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

我還試圖與沒有成功: 結果= multiprocessing.Pool(5).MAP(拉姆達ARGS:self.postAd(currentAccount.login,currentAccount.password,campaign.titlesFile,campaign.licLocFile,campaign.subCity ,campaign.bodiesMainFile,campaign.bodiesKeywordsFile,campaign.bodiesIntroFile),range(3)) 錯誤:Can not pickle at 0x0000000002F3CBF8>:屬性查找函數失敗 –

+0

您真的希望所有三個調用都使用*完全相同的參數嗎?我不確定這是否適用於map,因爲它總是希望從它循環的序列(在這種情況下爲'range')提供額外的參數。你可以通過編寫一個額外的函數來忽略它的最後一個參數(並且使用'partial(self.postadd,* data)'),但是使用你自己的創建'Process'es的循環可能更容易。 – Blckknght

+0

是的我希望它使用相同的參數。我想同時發生3x的過程是原因。 我該怎麼做「,但使用自己的循環創建進程可能會更容易。」你可以給我一個基於我的代碼的例子,如果你是如此友善 –

回答

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。有一個名爲函數中定義使用def更換拉姆達:

def postNow(arg): # Accepts an argument from map which it ignores 
    self.postAd(currentAccount.login, ..., campaign.bodiesIntroFile) 

旁註:

這是一個有點奇怪的是你的論點的拉姆達被稱爲args時,它只是一個參數。如果您的目的是使其更靈活並接受可變參數,請使用lambda *args: ...或甚至lambda *args, **kwargs: ...接受關鍵字參數。名字並不重要,它們只是慣例。重要的部分是***。作爲示例,請注意partial具有這樣的簽名。

我從來沒有見過這個問題,以前的第二次嘗試。我通過Google錯誤信息來了解它。總是Google的東西。

+0

感謝您的答覆亞歷克斯。我仍然是一名初學者的python程序員,所以這些都是我的頭腦。我嘗試了1. partial(self.postAd,* data)和2. multiprocessing.Pool(5).map(partial(self.postAd,currentAccount.login,currentAccount.password,campaign.titlesFile,campaign.licLocFile ,campaign.subCity,campaign.bodiesMainFile,campaign.bodiesKeywordsFile,campaign.bodiesIntroFile),range(3)-----------------。並得到了這兩個錯誤:Error :postAd()需要9個位置參數,但是有10個參數。我不確定第10個參數是在哪裏,因爲我只傳遞了8個。 –

+0

@DanielRusu它獲得了8個正常參數'self',第10個參數是值'from'range(3)''由'map'傳入,修改'postAd'對於這種情況沒有什麼意義,所以實際上只是忘記嘗試使用'partial',它並不是爲此而設計的。 –