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

 

posted @ 2021-09-07 10:18  小毛编  阅读(524)  评论(0)    收藏  举报