Python並行編程(九):多進程對象交換之pipe(管道)實現生產者-消費者模型

什麼是管道?

Pipe經常使用來在兩個進程間進行通訊,兩個進程分別位於管道的兩端。 Pipe方法返回(conn1,conn2)表明一個管道的兩個端,Pipe方法有duplex參數,若是duplex參數爲True(默認值),那麼這個管道是全雙工模式,也就是說conn1conn2都可收發,若duplex爲False,conn1只負責接收消息,conn2只負責發送消息。send和recv方法分別是發送和接收消息的方法。例如,在全雙工模式下,能夠調用conn1.send發送消息,conn1.recv接收消息。若是沒有消息可接收,recv方法會一直阻塞。若是管道已經被關閉,那麼recv方法會拋出EOFError.python

生產者-消費者模型

即咱們也能夠利用管道的特性實現生產者-消費者模型:dom

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()

複製代碼

運行截圖以下: spa

運行結果
能夠看到,管道是相似於文件讀寫,只是字節流的讀寫,多個共用很容易就受干擾,官方文檔有過明確給出即進程若進程頻繁的讀寫操做經過訪問管道方式實現,容易出現錯誤。
相關文章
相關標籤/搜索