【Python併發】【Python多進程(二)】進程間通信

【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章