【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