Python中进程如何相互共享列表?

1 投票
3 回答
2653 浏览
提问于 2025-04-17 11:03

请告诉我,如何让一个列表或数组在多个进程之间共享,这样它们就可以访问、添加或删除里面的数据?我需要使用管理器吗?

比如,我有一段代码是用多进程来对多个主机进行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 这个列表。

撰写回答