zmq python 客户端脚本

通常socket都有 超时、noblock相关用法,zmq基于socket也带有类似用法如下

## 防止无限等待

参考 https://www.codenong.com/7538988/

1、设置超时

client_receiver.RCVTIMEO 1000 # in milliseconds

2、使用轮询器【推荐】

1
2
poller = zmq.Poller()
poller.register(client_receiver, zmq.POLLIN) # POLLIN for recv, POLLOUT for send

poller.poll()超时:等待内容

1
evts = poller.poll(1000) # wait *up to* one second for a message to arrive.

如果没有任何内容,evts将是一个空列表。eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import time
import threading
import zmq
 
topic = "" # <strong>数据开头可带过滤标签,sub订阅标签,空标签表示全收</strong>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

1
2
3
4
5
6
7
8
9
10
11
12
13
import time
import zmq
 
def producer():
    context = zmq.Context()
    zmq_socket = <strong>context.socket(zmq.PUSH)</strong>
    <strong>zmq_socket.bind("tcp://127.0.0.1:5557") # server 用 bind </strong>
    # 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 @   小毛编  阅读(426)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示