zmq python 客户端脚本
通常socket都有 超时、noblock相关用法,zmq基于socket也带有类似用法如下
## 防止无限等待
参考 https://www.codenong.com/7538988/
1、设置超时
client_receiver.RCVTIMEO = 1000 # in milliseconds
2、使用轮询器【推荐】
poller = zmq.Poller() poller.register(client_receiver, zmq.POLLIN) # POLLIN for recv, POLLOUT for send
poller.poll()超时:等待内容
evts = poller.poll(1000) # wait *up to* one second for a message to arrive.
如果没有任何内容,evts将是一个空列表。eg:
def consumer:
context = zmq.Context()
reciver = context.socket(zmq.PULL)
reciver.connect('tcp://127.0.0.1:****')
sender = context.socket(zmq.PUSH)
sender.connect('tcp://127.0.0.1:****')
while not stop:
sockets = dict(poller.poll(1000))
if sockets:
if sockets.get(reciver) == zmq.POLLIN:
try:
data = reciver.recv(zmq.NOBLOCK)
sender.send(data, zmq.NOBLOCK)
print("reposting...")
except Exception as rev_err:
print(rev_err)
参考:
https://www.cnblogs.com/silence-cho/p/12657234.html
https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html
https://segmentfault.com/a/1190000012010573
ZeroMQ:基于socket,跨进程、跨ip通信。
ZeroMQ的三种通信模式分别是:
1 Request-Reply:req-reply:一问一答
2 Publisher-subscriber
import time import threading import zmq topic = "" # 数据开头可带过滤标签,sub订阅标签,空标签表示全收
def start_server():
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5557")
data = '{"client1": 1, "client2": 0}'
while True:
msg = "{}{}".format(topic, data)
socket.send_string(msg)
print(msg)
time.sleep(5)
def client():
# coding:utf-8
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt_string(zmq.SUBSCRIBE, topic)
socket.connect("tcp://127.0.0.1:5557")
while True:
rev_msg = socket.recv()
print("{} ---receiving:{}".format(time.strftime('%Y%m%d%H%M%S', time.localtime()), rev_msg))
class RunServer(threading.Thread):
def __init__(self, function):
threading.Thread.__init__(self)
self.function = function
def run(self):
self.function()
server = RunServer(start_server)
server.start()
client = RunServer(client)
client.start()
3 Parallel Pipeline:不需标签,数据全接收
1)producer
import time
import zmq
def producer():
context = zmq.Context()
zmq_socket = context.socket(zmq.PUSH)
zmq_socket.bind("tcp://127.0.0.1:5557") # server 用 bind
# Start your result manager and workers before you start your producers
for num in xrange(20000):
work_message = { 'num' : num }
zmq_socket.send_json(work_message)
producer()
2)consumer
import time import zmq import random def consumer(): consumer_id = random.randrange(1,10005) print "I am consumer #%s" % (consumer_id) context = zmq.Context() # recieve work consumer_receiver = context.socket(zmq.PULL) # receive pull consumer_receiver.connect("tcp://127.0.0.1:5557") # send work consumer_sender = context.socket(zmq.PUSH) # send push consumer_sender.connect("tcp://127.0.0.1:5558") while True: work = consumer_receiver.recv_json() data = work['num'] result = { 'consumer' : consumer_id, 'num' : data} if data%2 == 0: consumer_sender.send_json(result) consumer()
3)collector
import time import zmq import pprint def result_collector(): context = zmq.Context() results_receiver = context.socket(zmq.PULL) # 获取pull results_receiver.bind("tcp://127.0.0.1:5558") # 用bind绑定 collecter_data = {} for x in xrange(1000): result = results_receiver.recv_json() if collecter_data.has_key(result['consumer']): collecter_data[result['consumer']] = collecter_data[result['consumer']] + 1 else: collecter_data[result['consumer']] = 1 if x == 999: pprint.pprint(collecter_data) result_collector()
python安装zmq模块:pip install pyzmq

浙公网安备 33010602011771号