什麼是管道?
Pipe常用來在兩個程式間進行通訊,兩個程式分別位於管道的兩端。
Pipe方法返回(conn1,conn2)代表一個管道的兩個端,Pipe方法有duplex
引數,如果duplex
引數為True(預設值),那麼這個管道是全雙工模式,也就是說conn1
和conn2
均可收發,若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()
複製程式碼
執行截圖如下:
可以看到,管道是類似於檔案讀寫,只是位元組流的讀寫,多個共用很容易就受干擾,官方文件有過明確給出即程式若程式頻繁的讀寫操作通過訪問管道方式實現,容易出現錯誤。