2013-12-10 79 views
2

我在totalprocessing totaly。我試圖改變我的代碼,以便同時運行它的一部分。Python和多處理示例

我有一個巨大的列表,我必須調用每個節點的API。因爲API是獨立的,所以我不需要第一個API的結果就可以繼續進行第二個。所以,我有這樣的代碼:

def xmlpart1(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part1 

def xmlpart2(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part2 

def main(index): 
    mylist = [[..,..],[..,..],[..,..],[..,...]] # A huge list of lists with ids I need for calling the APIs 
    myL= mylist[index] c 
    mydic = {} 
    for i in myL: 
     flag1 = xmlpart1(i) 
     flag2 = xmlpart2(i) 
     mydic[flag1] = flag2 

    root = "myfilename %s.json" %(str(index)) 

    with open(root, "wb") as f: 
     json.dump(mydic,f) 

from multiprocessing import Pool 

if __name__=='__main__': 
    Pool().map(main, [0,1,2,3]) 

從這裏,並從聊天的幾個建議後,我結束了這段代碼。問題仍然存在。我在9:50運行腳本。 10:25第一個文件「myfilename 0.json」出現在我的文件夾中。現在是11:25,其他文件都沒有出現。子列表具有相同的長度,並且它們執行相同的操作,所以它們大約需要相同的時間。

+0

我很困惑,你問什麼幫助,在這裏。因爲名稱代碼[1-4]被重用(函數沒有主要方法),所以發佈的代碼將不起作用,並且輸出數據處理的問題在您根本沒有顯示的代碼中。 –

+0

現在比較好。主要功能來自導入的功能。如果我在一個腳本中運行代碼,我沒有問題。所以問題不在於main()函數,而在於如何使用多處理庫 – Tasos

+0

這不是保存數據的多處理庫。失敗的部分不在您展示的部分中。 –

回答

1

這是更適合multiprocessing.Pool()類的東西。

這裏有一個簡單的例子:

from multiprocessing import Pool 

def job(args): 
    """Your job function""" 


Pool().map(job, inputs) 

其中:

  • inputs是你的輸入列表。每個輸入都被傳遞給作業並在一個單獨的進程中處理。

當所有作業都完成後,您將結果返回列表。

multiprocessing.Pool().map就像Python builtin map()一樣,但爲您設置一個工作進程池並將每個輸入傳遞給給定的函數。

查看文檔的更多細節:http://docs.python.org/2/library/multiprocessing.html

+0

如果我會這樣做,輸出文件將被覆蓋。爲了使輸出json文件有4個不同的名稱,我使用了4個不同的函數。 – Tasos

+0

你讓你的''job()''函數輸出文件並寫入單獨的文件。 ''job()''函數不需要返回任何東西。 –

+0

非常感謝。我嘗試了3個和4個池,但我的四核筆記本電腦在兩種情況下都凍結了。沒關係,我只能使用2個池? – Tasos