Pipe經常使用來在兩個進程間進行通訊,兩個進程分別位於管道的兩端。 Pipe方法返回(conn1,conn2)表明一個管道的兩個端,Pipe方法有duplex
參數,若是duplex
參數爲True(默認值),那麼這個管道是全雙工模式,也就是說conn1
和conn2
都可收發,若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
能夠看到,管道是相似於文件讀寫,只是字節流的讀寫,多個共用很容易就受干擾,官方文檔有過明確給出即進程若進程頻繁的讀寫操做經過訪問管道方式實現,容易出現錯誤。