【Python并发】【Python多进程(一)】创建进程
【Python并发】【Python多进程(二)】进程间通信
【Python并发】【Python多进程(三)】进程间数据共享
【Python并发】【Python多进程(四)】进程同步
Python中常见的进程间通信方式主要是队列(Queue)和管道(Pipe)
一、队列(Queue)
队列主要用于多进程之间的通信,下面以生产者-消费者为例。
from multiprocessing import Process, Queue
import time, os
def prodcut(q):
print("开始生产.")
for i in range(5):
time.sleep(1)
q.put('产品'+str(i))
print("产品"+str(i)+"生产完成")
def consume(q):
while True:
prod = q.get()
print("消费者:{},消费产品:{}".format(os.getpid(), prod))
time.sleep(1)
if __name__ == '__main__':
q = Queue()
p = Process(target=prodcut, args=(q, )) # 生产者
c1 = Process(target=consume, args=(q, )) # 消费者1
c2 = Process(target=consume, args=(q, )) # 消费者2
p.start()
c1.start()
c2.start()
p.join() # 当生产者结束后,将两个消费则也结束
c1.terminate()
c2.terminate()
输出:
开始生产.
产品0生产完成
开始生产.
消费者:20072,消费产品:产品0
产品1生产完成
开始生产.
消费者:21900,消费产品:产品1
产品2生产完成
开始生产.
消费者:20072,消费产品:产品2
产品3生产完成
开始生产.
消费者:21900,消费产品:产品3
产品4生产完成
消费者:20072,消费产品:产品4
二、管道(Pipe)
pipe的方式主要用于两个进程间的通信,进程分别位于pipe的两端。Pipe()方法会返回管道的两个端,分别用于发送和接收。
from multiprocessing import Pipe, Pool
import os,time
def product(send_pipe):
print("开始生产.")
for i in range(5):
time.sleep(1)
send_pipe.send("产品"+str(i))
print("产品" + str(i) + "生产完成")
def consume(recv_pipe):
while True:
print("消费者:{},消费产品:{}".format(os.getpid(), recv_pipe.recv()))
time.sleep(1)
if __name__ == '__main__':
# 使用进程池来创建进程
send_pipe, recv_pipe = Pipe()
pool = Pool(2)
pool.apply_async(product, args=(send_pipe,))
pool.apply_async(consume, args=(recv_pipe,))
pool.close()
pool.join()
输出:
开始生产.
产品0生产完成
消费者:25036,消费产品:产品0
产品1生产完成
消费者:25036,消费产品:产品1
产品2生产完成
消费者:25036,消费产品:产品2
产品3生产完成
消费者:25036,消费产品:产品3
产品4生产完成
消费者:25036,消费产品:产品4