pipe实现单工和半双工模式

其实网上用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。

但是,其实从全双工的概念来看,以上的代码只是半双工而已,实际应用场景中,这种方式也够用了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值