pipe实现单工和半双工模式
生活随笔
收集整理的這篇文章主要介紹了
pipe实现单工和半双工模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
其實(shí)網(wǎng)上用pipe的python代碼所謂的全雙工,其實(shí)都是半雙工。
單工模式代碼:
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()以上的代碼中,如果開(kāi)進(jìn)程的那兩句,conn1和conn2互換,就會(huì)報(bào)錯(cuò),所以說(shuō)是單工,因?yàn)橹荒芤欢税l(fā)(只讀),一端收(只寫(xiě))。半雙工代碼:
代碼轉(zhuǎn)載和改編自: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可以互換,不會(huì)報(bào)錯(cuò),說(shuō)明兩端可以是收-發(fā),也可以是發(fā)-收,所以是半雙工。參考鏈接中的說(shuō)法是:
Pipe方法返回(conn1, conn2)代表一個(gè)管道的兩個(gè)端。Pipe方法有duplex參數(shù),如果duplex參數(shù)為T(mén)rue(默認(rèn)值),那么這個(gè)管道是全雙工模式,也就是說(shuō) conn1和conn2均可收發(fā)。duplex為False,conn1只負(fù)責(zé)接受消息,conn2只負(fù)責(zé)發(fā)送消息。 其實(shí),所謂的全雙工模式并不是真正的全雙工模式 send和recv方法分別是發(fā)送和接受消息的方法。例如,在全雙工模式下,可以調(diào)用conn1.send發(fā)送消息,conn1.recv接收消息。如果沒(méi)有消息可接收,recv方法會(huì)一直阻塞。如果管道已經(jīng)被關(guān)閉,那么recv方法會(huì)拋出EOFError。但是,其實(shí)從全雙工的概念來(lái)看,以上的代碼只是半雙工而已,實(shí)際應(yīng)用場(chǎng)景中,這種方式也夠用了。
總結(jié)
以上是生活随笔為你收集整理的pipe实现单工和半双工模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。