Python中进程如何相互共享列表?
请告诉我,如何让一个列表或数组在多个进程之间共享,这样它们就可以访问、添加或删除里面的数据?我需要使用管理器吗?
比如,我有一段代码是用多进程来对多个主机进行ping测试:
#!/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!
3 个回答
-1
我强烈建议你使用像redis这样的东西(http://redis.io)。redis是一个数据结构服务器,它的主要目的是帮助大家安全地共享数据结构。
2
你需要的数据结构是 multiprocessing.Queue
。你可以从这个队列中取出值,放到一个列表里,直到取出的值和进程的数量一样多,然后再对这些值进行排序和打印。不过,针对你具体的应用,Dan D 提到的 pool.map
方法会更合适。
1
注意,pool.map
的作用和内置的 map
函数很像,它会返回一个列表,这个列表是把你给定的函数应用到指定列表中的每个元素后得到的结果。
所以你只需要让 ping()
函数返回它找到的内容,然后执行:
list_of_values = pool.map(ping, host, 1)
之后你可以随意使用 list_of_values
这个列表。