Python並行程式設計(九):多程式物件交換之pipe(管道)實現生產者-消費者模型

若數發表於2019-04-16

什麼是管道?

Pipe常用來在兩個程式間進行通訊,兩個程式分別位於管道的兩端。 Pipe方法返回(conn1,conn2)代表一個管道的兩個端,Pipe方法有duplex引數,如果duplex引數為True(預設值),那麼這個管道是全雙工模式,也就是說conn1conn2均可收發,若duplex為False,conn1只負責接收訊息,conn2只負責傳送訊息。send和recv方法分別是傳送和接收訊息的方法。例如,在全雙工模式下,可以呼叫conn1.send傳送訊息,conn1.recv接收訊息。如果沒有訊息可接收,recv方法會一直阻塞。如果管道已經被關閉,那麼recv方法會丟擲EOFError.

生產者-消費者模型

即我們也可以利用管道的特性實現生產者-消費者模型:


import multiprocessing

import random

import time
import os


def producer(pipe):

    while True:
        time.sleep(1)
        item = random.randint(1, 10)
        print('process producer product goods:{}'.format(item))
        pipe.send(item)
        time.sleep(1)


def consumer(pipe):

    while True:
        time.sleep(1)
        item = pipe.recv()
        print('process cusumer get goods:{}'.format(item))
        time.sleep(1)


if __name__ == "__main__":

    pipe = multiprocessing.Pipe()

    process_producer = multiprocessing.Process(
        target=producer, args=(pipe[0],))

    process_consumer = multiprocessing.Process(
        target=consumer, args=(pipe[1],))

    process_producer.start()
    process_consumer.start()

    process_producer.join()
    process_consumer.join()

複製程式碼

執行截圖如下:

執行結果
可以看到,管道是類似於檔案讀寫,只是位元組流的讀寫,多個共用很容易就受干擾,官方文件有過明確給出即程式若程式頻繁的讀寫操作通過訪問管道方式實現,容易出現錯誤。

相關文章