【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