Python实现进程间数据通信的4种方式详解

拾柒
拾柒
发布时间:2026-10-13 | 2人浏览过
原创

本文详细介绍Python中实现进程间数据通信的四种主要方式。包括使用multiprocessing.Queue进行基础通信、利用Manager.Queue解决Pool池内通信限制、通过Pipe实现高性能的双向通信,以及使用Manager提供的数据结构进行共享。文章对比了各方法的适用场景与性能差异,帮助开发者根据实际需求选择最佳方案。

Python进程间通信概述

Python语言提供了4种主要方式来实现进程间的数据通信,以满足不同场景下的并发处理需求。

基于Queue的基础通信

第一种方式是使用multiprocessing.Queue。该队列对象允许在独立的进程之间传递数据。需要注意的是,这种方式创建的Queue无法直接在由Pool进程池创建的子进程之间进行通信,因为Pool管理的进程生命周期和队列绑定机制与普通Process不同。

解决Pool池内的Queue通信

第二种方式是使用multiprocessing.Manager创建的Queue。Manager提供了一种机制,使得由Pool进程池创建的子进程也能够通过该Queue进行通信。这是解决Pool环境下进程间数据交换的有效手段,确保了进程池内部通信的可行性。

高性能Pipe管道通信

第三种方式是通过Pipe(管道)进行通信。Pipe通常用于两个进程之间的直接数据交换,其通信性能高于Queue,因为Pipe绕过了队列的额外开销。然而,Pipe的限制在于它仅支持两个进程之间的双向通信,不适合多对多的复杂通信场景。原文指出“线程间”,但结合上下文及Pipe特性,此处应理解为进程间通信。

Manager共享数据结构通信

第四种方式是使用Manager类提供的数据结构(如字典、列表等)进行进程间通信。通过Manager创建的共享数据容器,多个进程可以并发地读写同一份数据,从而实现复杂的数据共享与通信。这种方式灵活性高,适用于需要共享复杂数据结构的情况。


from multiprocessing import Process, Queue, Pool, Manager, Pipe
# 注意线程间的通信,使用的queue.Queue
# from queue import Queue
import time


# 1. 使用multiprocessing.Queue可以在进程间通信

# def producer(queue):
#   queue.put('A')
#   time.sleep(2)
#
# def consumer(queue):
#   time.sleep(2)
#   data = queue.get()
#   print(data)
#
# if __name__ == '__main__':
#   queue= Queue(10)
#   p = Process(target=producer, args=(queue,))
#   c = Process(target=consumer, args=(queue,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 2. 使用共享全局变量,在多进程间通信(结论: 不行)
# def producer(a):
#   a += 1
#   time.sleep(2)
#
#
# def consumer(a):
#   time.sleep(2)
#   print(a)
#
# if __name__ == '__main__':
#   a = 1
#   p = Process(target=producer, args=(a,))
#   c = Process(target=consumer, args=(a,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 3. multiprocessing.Queue不能用于multiprocessing.Pool进程池创建的进程间进行通信
# def producer(queue):
#   queue.put('A')
#   time.sleep(2)
#
#
# def consumer(queue):
#   time.sleep(2)
#   data = queue.get()
#   print("consumer:%s" % data)
#
#
# if __name__ == '__main__':
#   # queue = Queue(10) # 这个是使用multiprocessing.Queue,无效
#   queue = Manager().Queue(10) # 这个是使用multiprocessing.Manager.Queue, 可以
#   pool = Pool(2)
#   pool.apply_async(producer, args=(queue,))
#   pool.apply_async(consumer, args=(queue,))
#   pool.close()
#   pool.join()


# 4.通过Pipe进行线程间的通信, pipe进程间通信的性能高于Queue
# def producer(pipe):
#   pipe.send('admin')
#
#
# def consumer(pipe):
#   data = pipe.recv()
#   print("consumer:%s" % data)
#
#
# if __name__ == '__main__':
#   receive_pipe, send_pipe = Pipe()
#   """Pipe只能适应于两个进程间的通信"""
#   p = Process(target=producer, args=(send_pipe,))
#   c = Process(target=consumer, args=(receive_pipe,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 5. 进程间通信的其它方式

def add_data(p_dict, key, value):
  p_dict[key] = value

if __name__ == '__main__':
  progress_dict = Manager().dict() #Manager()类中提供的数据结构都能够做到进程的通信
  first_progress = Process(target=add_data, args=(progress_dict, 'name', 'admin',))
  second_progress = Process(target=add_data, args=(progress_dict, 'age', 45,))
  first_progress.start()
  second_progress.start()
  first_progress.join()
  second_progress.join()
  print(progress_dict) #{'age': 45, 'name': 'admin'}

以上即为Python中实现进程间数据通信的4种核心方式及其特点总结。希望这些内容能帮助开发者更好地理解和应用多进程通信机制,提升程序并发处理的效率与稳定性。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表