随笔记录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
阅读全文
0 0
- 随笔记录zmq中的poller()用法
- zmq 中的事件类型
- zmq 中的事件
- zmq 中的 zmq_curve
- zmq中的 zmq_curve_keypair
- zmq 中的 zmq_disconnect
- zmq中的 zmq_errno
- zmq中的 zmq_getsockopt
- zmq 中的 zmq_init
- zmq 中的 inproc
- zmq中的IPC
- zmq中的zmq_msg_close
- zmq中的zmq_msg_copy
- zmq中的zmq_msg_data
- 编程随笔--记录编程生涯中的点点滴滴
- zmq 中的cs 模式总结
- ZMQ
- ZMQ
- 灵活加载Fragment(存在问题)
- 动态规划
- 安全通信系统--OpenSSL服务器和客户端
- web前端工程师必备的六大技术,你了解吗?
- spring cloud Hystrix 3 (服务容器保护)
- 随笔记录zmq中的poller()用法
- [App] Tcpdump 抓包工具之基本用法
- [转]Windbg Symbol符号文件设置
- 第二届全国中医药院校程序设计竞赛
- windows和Linux查看文件MD5的方法
- linux中firewalld几个使用场景
- Kafka简单介绍
- 在VS2017创建C语言项目
- 反转字符串