其实网上用pipe的python代码所谓的全双工,其实都是半双工。
单工模式代码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import multiprocessing
import time
def 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 time
def 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。
但是,其实从全双工的概念来看,以上的代码只是半双工而已,实际应用场景中,这种方式也够用了。