pyzmq--ProcessDevice、ProcessProxy、monitored_queue 性能比较

pyzmq----ProcessDevice、ProcessProxy、monitored_queue 性能比较

说明

ProcessDevice、ProcessProxy、monitored_queue 在队列转发性能比较,
测试数据:单进程顺序 50w条信息

客户端脚本
  • 顺序PUB发送50w条数据
# 测试数据发送脚本
import zmq
import time

state_url = 'tcp://127.0.0.1:5607'
log_url = 'tcp://127.0.0.1:5606'

def log_client():
    topic = b'logTestV1'
    ctx = zmq.Context.instance()
    state_socket = ctx.socket(zmq.REQ)
    state_socket.connect(state_url)
    state_socket.send_multipart([b'INIT', topic])
    resp = state_socket.recv_multipart()
    print(resp)
    print('准备写入日志')
    log_pub = ctx.socket(zmq.PUB)
    log_pub.hwm = 30000
    log_pub.connect(log_url)
    time.sleep(1)
    for i in range(500000):
        print(i)
        log_pub.send_multipart([topic, f'日志写入测试日志写入测试:{i}\n'.encode('utf-8')])
    print(f'{topic}发送完毕')
    time.sleep(60 * 2)

log_client()
服务端转发部分代码
  • ProcessDevice 、ProcessProxy 涉及代码
  • ProcessDevice 、ProcessProxy 都是在新的进程中启动
    def log_queue_device(self):
        """
            转发进程队列设备
        :return:
        """
        if self.concurrency == 'process':
            # pd = ProcessDevice(zmq.QUEUE, zmq.SUB, zmq.PUB)
            pd = ProcessProxy(zmq.SUB, zmq.PUB)
        else:
            pd = ThreadDevice(zmq.QUEUE, zmq.SUB, zmq.PUB)
        pd.bind_in(self.in_url)
        pd.bind_out(self.out_url)
        pd.setsockopt_in(zmq.SUBSCRIBE, b'')
        pd.setsockopt_in(zmq.RCVHWM, RCV_HWM_VALUE)
        pd.setsockopt_out(zmq.SNDHWM, SND_HWM_VALUE)
        return pd
  • monitored_queue 函数使用,该函数用Cython写的,因此循环不涉及Python。理论上性能会比较好。
  • log_monitored_queue 通过 multiprocessing.Process 启动,在一个新的进程中运行
from zmq.devices import monitored_queue

def log_monitored_queue(in_url, out_url, RCV_HWM_VALUE, SND_HWM_VALUE):
    ctx = zmq.Context.instance()
    ins = ctx.socket(zmq.SUB)
    ins.setsockopt(zmq.SUBSCRIBE, b'')
    ins.setsockopt(zmq.RCVHWM, RCV_HWM_VALUE)
    ins.bind(in_url)
    outs = ctx.socket(zmq.PUB)
    outs.setsockopt(zmq.SNDHWM, SND_HWM_VALUE)
    outs.bind(out_url)
    mons = ctx.socket(zmq.PUB)
    mons.bind('inproc://MonQueue')
    monitored_queue(ins, outs, mons)
结论

三种模式,性能差不多,我测试项目是一个分布式日志项目,测试环境是我个人笔记本电脑,结果仅供参考

模式耗时
ProcessDevice1分22秒
ProcessProxy1分16秒
monitored_queue1分22秒
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值