pipe实现单工和半双工模式
生活随笔
收集整理的這篇文章主要介紹了
pipe实现单工和半双工模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其實網上用pipe的python代碼所謂的全雙工,其實都是半雙工。
單工模式代碼:
import sys reload(sys) sys.setdefaultencoding('utf-8') import multiprocessing import timedef proc1(pipe):# while True:for i in range(3):print ("send: %s" %(i))pipe.send(i)time.sleep(1)def proc2(pipe):while True:print ("proc2 rev:", pipe.recv())time.sleep(1)def proc3(pipe):while True:print ("PROC3 rev:", pipe.recv())time.sleep(1)if __name__ == "__main__":duplex=False#單工模式conn1,conn2 = multiprocessing.Pipe(duplex)p1 = multiprocessing.Process(target=proc1, args=(conn2,))p2 = multiprocessing.Process(target=proc2, args=(conn1,))#p3 = multiprocessing.Process(target=proc3, args=(pipe[1],))p1.start()p2.start()#p3.start()p1.join()p2.join()#p3.join()以上的代碼中,如果開進程的那兩句,conn1和conn2互換,就會報錯,所以說是單工,因為只能一端發(只讀),一端收(只寫)。半雙工代碼:
代碼轉載和改編自:http://www.yeayee.com/article-6604068-1.html
#-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import multiprocessing import timedef proc1(pipe):# while True:for i in range(3):print ("send: %s" %(i))pipe.send(i)time.sleep(1)def proc2(pipe):while True:print ("proc2 rev:", pipe.recv())time.sleep(1)def proc3(pipe):while True:print ("PROC3 rev:", pipe.recv())time.sleep(1)if __name__ == "__main__":duplex=True#半雙工conn1,conn2 = multiprocessing.Pipe(duplex)p1 = multiprocessing.Process(target=proc1, args=(conn1,))p2 = multiprocessing.Process(target=proc2, args=(conn2,))#p3 = multiprocessing.Process(target=proc3, args=(pipe[1],))p1.start()p2.start()#p3.start()p1.join()p2.join()#p3.join()以上conn1與conn2可以互換,不會報錯,說明兩端可以是收-發,也可以是發-收,所以是半雙工。參考鏈接中的說法是:
Pipe方法返回(conn1, conn2)代表一個管道的兩個端。Pipe方法有duplex參數,如果duplex參數為True(默認值),那么這個管道是全雙工模式,也就是說 conn1和conn2均可收發。duplex為False,conn1只負責接受消息,conn2只負責發送消息。 其實,所謂的全雙工模式并不是真正的全雙工模式 send和recv方法分別是發送和接受消息的方法。例如,在全雙工模式下,可以調用conn1.send發送消息,conn1.recv接收消息。如果沒有消息可接收,recv方法會一直阻塞。如果管道已經被關閉,那么recv方法會拋出EOFError。但是,其實從全雙工的概念來看,以上的代碼只是半雙工而已,實際應用場景中,這種方式也夠用了。
總結
以上是生活随笔為你收集整理的pipe实现单工和半双工模式的全部內容,希望文章能夠幫你解決所遇到的問題。