2012-01-25 28 views
1

請指正我如何在進程之間共享列表或數組,以便他們可以訪問/追加/刪除數據?我需要使用Manager嗎? 例如,我有一個使用多坪幾臺主機代碼:進程如何在Python中彼此共享列表?

#!/usr/bin/env python 

from multiprocessing import Pool 
import os 

def ping(ip): 
    report = ("No response","Partial Response","Alive") 
    pingaling = os.popen("ping -q -c2 "+str(ip),"r") 
    while 1: 
    line = pingaling.readline() 
    try: 
     result = line[line.find(','):].split()[1] 
     output = report[int(result[0])] 
    except: 
     pass 
    if not line: break 
    print "Testing %s : %s!" % (ip, output) 

if __name__ == '__main__': 
    pool = Pool(processes=3) 
    host = ['81.24.212.'+str(x) for x in range(10)] 
    pool.map(ping, host, 1) 
    pool.close() 
    pool.join() 

但產量無序,但是我要輸出添加到一個數組和排序是:

Testing 81.24.212.1 : Alive! 
Testing 81.24.212.2 : Alive! 
Testing 81.24.212.6 : Alive! 
Testing 81.24.212.0 : No response! 
Testing 81.24.212.5 : No response! 
Testing 81.24.212.3 : No response! 
Testing 81.24.212.4 : No response! 
Testing 81.24.212.9 : No response! 
Testing 81.24.212.7 : No response! 
Testing 81.24.212.8 : No response! 

回答

1

注意pool.map行爲很像buildin map函數,並且像返回給定函數的應用程序的結果列表給給列表中的元素一樣。

所以你只需要擁有ping()回它找到了什麼,然後做:

list_of_values = pool.map(ping, host, 1) 

之後就可以使用list_of_values你喜歡

+0

yup,that worked,thx – insider

-1

什麼辦法,我強烈建議你使用類似的Redis( http://redis.io),這是一個數據結構服務器 - 它的存在是爲了以一種可靠的方式來共享數據結構。

2

您正在查找的數據結構是multiprocessing.Queue。您可以將隊列中的值彈出列表,直到您獲得的值與進程中的值相同,然後對其進行分類和打印。但是,對於您的特定應用程序,Dan D的pool.map答案有更好的方法。

+0

如果你能用簡短的例子來描述,我將不勝感激。 – insider