随笔记录zmq中的poller()用法

来源:互联网 发布:电脑桌面的软件打不开 编辑:程序博客网 时间:2024/06/03 23:49

              一个线程中如果有多个sokect,同时需要收发数据时,zmq提供polling sockets实现,不用在send()或者recv()时阻塞socket。

下面是一个在recv()端接受信息的poller()轮询接受代码。

#!/usr/bin/python# -*- coding: utf-8import zmqimport randomimport timefrom  multiprocessing import Processdef server_push(port="5556"):    context = zmq.Context()    socket = context.socket(zmq.PUSH)    socket.bind("tcp://*:%s" % port)    print "Running server on port: ", port    # serves only 5 request and dies    for reqnum in range(10):        if reqnum < 6:            socket.send("Continue")        else:            socket.send("Exit")            break        time.sleep (1)def server_pub(port="5558"):    context = zmq.Context()    socket = context.socket(zmq.PUB)    socket.bind("tcp://*:%s" % port)    publisher_id = random.randrange(0,9999)    print "Running server on port: ", port    # serves only 5 request and dies    for reqnum in range(10):        # Wait for next request from client        topic = random.randrange(8,10)        messagedata = "server#%s" % publisher_id        print "%s %s" % (topic, messagedata)        socket.send("%d %s" % (topic, messagedata))        time.sleep(1)def client(port_push, port_sub):    context = zmq.Context()    socket_pull = context.socket(zmq.PULL)    socket_pull.connect ("tcp://localhost:%s" % port_push)    print "Connected to server with port %s" % port_push    socket_sub = context.socket(zmq.SUB)    socket_sub.connect ("tcp://localhost:%s" % port_sub)    socket_sub.setsockopt(zmq.SUBSCRIBE, "9")    #zmq.SUBSCRIBE创建一个消息过滤标志,订阅以9为前缀的消息    print "Connected to publisher with port %s" % port_sub    # 初始化Poller    poller = zmq.Poller()    poller.register(socket_pull, zmq.POLLIN)    poller.register(socket_sub, zmq.POLLIN)    # Work on requests from both server and publisher    #如果设置为POLLIN则刷新recv,与之对应的是POLLOUT刷新send发送事件,也可以同时设置两个标志    should_continue = True    while should_continue:        socks = dict(poller.poll())        if socket_pull in socks and socks[socket_pull] == zmq.POLLIN:            message = socket_pull.recv()            print "Recieved control command: %s" % message            if message == "Exit":                print "Recieved exit command, client will stop recieving messages"                should_continue = False        if socket_sub in socks and socks[socket_sub] == zmq.POLLIN:            string = socket_sub.recv()            topic, messagedata = string.split()            #Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串            #str.split(str="", num=string.count(str)).            # str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等,num -- 分割次数            print "Processing ... ", topic, messagedataif __name__ == "__main__":    # Now we can run a few servers    server_push_port = "5556"    server_pub_port = "5558"    Process(target=server_push, args=(server_push_port,)).start()    Process(target=server_pub, args=(server_pub_port,)).start()    Process(target=client, args=(server_push_port,server_pub_port,)).start()

在poller中POLLIN和POLLOUT的区别是pollin在recv()端,负责刷新recv端口,来接受信息,POLLOUT在send()端口,负责刷新send端,来发送消息。

 

flag (int, default=POLLIN|POLLOUT) – 0MQpoll flags. If flag|POLLIN, recv events will be flushed. If flag|POLLOUT, sendevents will be flushed. Both flags can be set at once, which is the default.

这是程序运行结果。



  • Running server on port:  5556Running server on port:  55588 server#5230Connected to server with port 5556Connected to publisher with port 5558Recieved control command: Continue8 server#5230Recieved control command: Continue9 server#5230Processing ...  9 server#5230Recieved control command: Continue9 server#5230Processing ...  9 server#5230Recieved control command: Continue9 server#5230Processing ...  9 server#5230Recieved control command: Continue9 server#5230Processing ...  9 server#5230Recieved control command: Continue9 server#5230Processing ...  9 server#5230Recieved control command: ExitRecieved exit command, client will stop recieving messages8 server#52309 server#52309 server#5230Process finished with exit code 0
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办 江西银行网银密码忘了怎么办 广发信用卡网银密码忘了怎么办 刚注册的淘宝账号买不了东西怎么办 隐藏后的wif不知道用户名怎么办 脊柱侧弯术后钢钉断了一根怎么办 对法院执行裁定申请复议过期怎么办 自己家店名被别人注册了商标怎么办 有人去工商局投诉我公司了怎么办 急用钱怎么办啊有没有什么贷款啊 初级会计报名信息表没打印怎么办 电工证复审流程时间过了怎么办 应版权方要求无法下载的电影怎么办 手机设置蜜码小孩都能破解该怎么办 拍到了上海车牌不想买车了怎么办 买车4s店不给临时车牌怎么办 百度云谣绑定的邮箱被绑定了怎么办 百度网盘分享的视频打不开怎么办 在赶集网登录时忘记验证码该怎么办