

在上次的文章Python基础篇 - 多进程-全局变量的隔离我们认识到进程间是互不共享数据的,每个进程就相当于独立的工厂,其全局变量互不共享。那么要让进程间得以通信,实现数据的共享,就要借助multiprocessing模块中的queue队列机制。

一. 进程通信multiprocessing.Queue()
multiprocessing.Queue()返回一个共享队列(先进先出)实例。当一个进程将一个对象放进队列中时,一个写入线程会启动并将对象从缓冲区写入管道中,其他进程可从该队列中读取数据。默认队列是无限大小的,可以通过maxsize参数限制。
import osimport randomimport timeimport multiprocessing# 间隔时间向队列queue中放入数据def func1(queue):while True:data = random.randint(1, 10)queue.put(data)print(f'进程{os.getpid()},放入了数据{data}')time.sleep(0.5)# 从queue中取出数据def func2(queue):while True:result = queue.get()print(f'进程{os.getpid()},取出了数据{result}')if __name__ == "__main__":queue = multiprocessing.Queue() # 创建队列p1 = multiprocessing.Process(target=func1, args=(queue,))p2 = multiprocessing.Process(target=func2, args=(queue,))p1.start()p2.start()p1.join()p2.join()
二. 进程池间通信Manager().Queue()
进程池间的进程通话,原理还是基于队列queue实现数据共享,只是需要从Manager对象调用API接口。
import osimport randomimport timeimport multiprocessing# 间隔时间向队列queue中放入数据def func1(queue):while True:data = random.randint(1, 10)queue.put(data)print(f'进程{os.getpid()},放入了数据{data}')time.sleep(0.5) # 间隔0.5s# 从queue中取出数据def func2(queue):while True:result = queue.get()print(f'进程{os.getpid()},取出了数据{result}')if __name__ == "__main__":queue = multiprocessing.Manager().Queue() # 创建队列pool = multiprocessing.Pool(2) # 创建了大小为2的进程池pool.apply_async(func1, (queue,))pool.apply_async(func2, (queue,))pool.close()pool.join()

总结:今日我们学习了Python基础篇-多进程-进程间的通信。多进程间的数据相互隔离,无法直接共享变量,需借助队列实现数据交互。我们分别使用普通多进程队列与Manager管理队列,普通Queue适用于原生多进程,进程池场景必须使用Manager共享队列,保证跨进程数据安全读写,理解了多进程通信的底层隔离与共享原理。在Python基础篇,后续我们将持续学习Python基础知识,介绍各种算法,祝每一位study er学习愉快。

