nng 是 zeromq 的后辈,nanomsg 的 下一代的消息处理库。
主要就是快,上手超快,消息收发也超快。
本机 python 3.9 + pynng 0.7.1 本地环回测试 10000次1G数据,只需要1秒就可以完成。

nng相比zeromq的目前发现优势,链接状态全自动维护,自动重连,掉线重连能快速恢复,数据发送不完整时能自动无限重发(默认情况),报头能全定义从而能支持http协议,速度飞快。

以下4个简单完整例子
_try_push_pull.py
_try_pair_pair.py
_try_pub_sub.py
_try_rep_req.py

pynng安装

pip install -U pynng

_try_push_pull.py

from pynng import nng
from multiprocessing import Process
import numpy as np
import pickledef proc_send_data():'''push端只管发数据:return:'''sock = nng.Push0(dial='tcp://127.0.0.1:8855')for i in range(10000):data = np.random.uniform([128, 4, 512, 512])data = pickle.dumps(data)sock.send(data)sock.close()def proc_recv_data():'''pull端只管收数据:return:'''sock = nng.Pull0(listen='tcp://127.0.0.1:8855')for i in range(10000):r = sock.recv(block=True)data = pickle.loads(r)print(i, np.mean(data))sock.close()if __name__ == '__main__':p1 = Process(target=proc_recv_data, daemon=True)p2 = Process(target=proc_send_data, daemon=True)print('start')p1.start()p2.start()p1.join()p2.join()print('success')

_try_pair_pair.py

from pynng import nng
from pynng.exceptions import TryAgain, Timeout
from multiprocessing import Process
import numpy as np
import pickle
import randomdef proc_send_data():'''pair端想发就发,想收就收如果发消息前,对端已经关掉了,那么将会卡在send函数那里,直到对端重新打开,或send_timeout超时:return:'''sock = nng.Pair0(dial='tcp://127.0.0.1:8855', recv_timeout=500, send_timeout=500)for i in range(10000):# 发送1G的数据。128*4*512*512*8/1024/1024=1024MBdata = np.random.uniform([128, 4, 512, 512])data = pickle.dumps(data)try:sock.send(data)except Timeout:# 如果对面端提前关了,那么这里会超时,这里直接跳出breakif random.random() < 0.5:try:r = sock.recv(block=False)print(r)except TryAgain:passprint('end1')sock.close()def proc_recv_data():'''pair端想发就发,想收就收:return:'''sock = nng.Pair0(listen='tcp://127.0.0.1:8855', recv_timeout=500, send_timeout=500)for i in range(10000):try:r = sock.recv(block=False)data = pickle.loads(r)print(i, np.mean(data))except TryAgain:# 如果没有消息passif random.random() < 0.5:try:sock.send(bytes([1]))except Timeout:# 如果对面端提前关了,那么这里会超时,这里直接跳出breakprint('end2')sock.close()if __name__ == '__main__':p1 = Process(target=proc_recv_data, daemon=True)p2 = Process(target=proc_send_data, daemon=True)p1.start()p2.start()p1.join()p2.join()print('success')

_try_pub_sub.py

from pynng import nng
from multiprocessing import Process
import numpy as np
import pickle
from pynng.exceptions import TryAgaindef proc_send_data():'''pub端 和push端相似,只管发数据:return:'''sock = nng.Pub0(listen='tcp://127.0.0.1:8855')for i in range(10000):data = np.random.uniform([128, 4, 512, 512])data = pickle.dumps(data)sock.send(data)sock.close()def proc_recv_data():'''sub端 和pull端相似,只管收数据。可以设定订阅标题和取消订阅标题。首次使用时,要设定为接收空标题,不然啥也收不到:return:'''sock = nng.Sub0(dial='tcp://127.0.0.1:8855')# 设定接受空标题sock.subscribe('')for i in range(10000):try:r = sock.recv(block=False)data = pickle.loads(r)print(i, np.mean(data))except TryAgain:print()sock.close()if __name__ == '__main__':p1 = Process(target=proc_recv_data, daemon=True)p2 = Process(target=proc_send_data, daemon=True)p1.start()p2.start()p1.join()p2.join()print('success')

_try_rep_req.py

from pynng import nng
from multiprocessing import Process
import numpy as np
import pickledef proc_send_data():'''req端一开始只能发送数据,并且发送完数据后,必定要接收数据:return:'''sock = nng.Req0(dial='tcp://127.0.0.1:8855')for i in range(10000):data = np.random.uniform([128, 4, 512, 512])data = pickle.dumps(data)sock.send(data)sock.recv()sock.close()def proc_recv_data():'''rep端一开始只能接收数据,并且接收完数据后,必定要发送一个长度不为0的数据:return:'''sock = nng.Rep0(listen='tcp://127.0.0.1:8855')for i in range(10000):r = sock.recv(block=True)data = pickle.loads(r)print(i, np.mean(data))# rep发送的数据长度不能为0sock.send(bytes([0]))sock.close()if __name__ == '__main__':p1 = Process(target=proc_recv_data, daemon=True)p2 = Process(target=proc_send_data, daemon=True)p1.start()p2.start()p1.join()p2.join()print('success')

pynng 超快速上手,但不保熟相关推荐

  1. 快速上手 TinyXML-2 不完全教程

    TinyXML-2 不完全教程 XML 作为程序开发中非常常用的数据文档之一,各个语言或是开发环境都有对应的用于处理 XML 文件的库.在 C++ 语言中,TinyXML-2 就是这样的一个库. Ti ...

  2. 全网最最最轻量级检测网络 yolo-fastest 快速上手

    文章目录 0x01 Yolo-Fastest 0x02 Prepare step1 clone step2 make step3 run darknet 0x03 Train step1 获取权重文件 ...

  3. 【转】Vue.js 2.0 快速上手精华梳理

    Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...

  4. pyqt5从子目录加载qrc文件_PyQt5快速上手基础篇10-QSettings用法

    前言 本节我们学习使用PyQt5的QSettings的用法,使用QSettings可以记住用户操作UI界面设置的参数,下次打开软件的时候,会直接加载用户上一次设置的参数. 一.基础知识 1.QSett ...

  5. PetaPoco 快速上手

    今天来给大家分享一个好用的轻型的.net框架的ORM--PetaPoco 本着快速上手的原则,我们通过和EF对比,让大家能快速使用PetaPoco PetaPoco大家可能没有听说过,但大家一定听说过 ...

  6. 启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用

    启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用 首先拿到开发板后,在印有Wireless-tag.com这一面的VCC GND 处供 3.3V 电源即可启动开发板 上电后开发 ...

  7. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  8. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  9. 暗影精灵 6 Plus 快速上手 大量游戏实测

    完整评测已更新: 如何评价惠普暗影精灵6 Plus,哪个版本最值得购买? 以下是原内容. 今年夏天的游戏本市场和往年有些不同,受到各方面的影响,弱势一点的品牌甚至都没办法把自家产品更新到最新的配置,而 ...

最新文章

  1. 手把手教你安装Linux虚拟机
  2. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
  3. Qmail的介绍和配置
  4. windows下安装composer方法(不修改PATH环境变量)
  5. 2013.5.21号面试心得
  6. 优雅地在Mac+Valet环境下本地部署phphub
  7. linux-free命令
  8. C++学习之路 | PTA乙级—— 1006 换个格式输出整数 (15分)(精简)
  9. linux 转码软件,分享|Linux 桌面中 4 个开源媒体转换工具
  10. SpringBoot使用GZIP压缩返回数据
  11. MFC 教程【9_MFC的状态】
  12. 犀牛Rhino教程合集37部
  13. 负反馈放大电路实验报告
  14. linux中原子操作atomic_read、atomic_set、atomic_add、atomic_sub
  15. 生成的SMILES以及对应的图像的评价指标【1】
  16. 全球顶尖公司的七大设计理念
  17. Fish shell 入门教程
  18. 有关图像生成的函数 .
  19. Redux 异步数据流-- thunk中间件源码解析
  20. Javascript对日期的进行加、减操作

热门文章

  1. 2022-2027年中国电压互感器行业发展监测及投资战略研究报告
  2. Java SE EE ME
  3. FlexSim批量操作插件
  4. android播放器可点击列表,Android上是否有任何播放器可以支持播放列表中的本地视频并可以预设播放顺序?...
  5. KeePass 中文汉化之通过繁体汉化版本文件快速转换为简体中文版本
  6. 学生Web管理系统(java+SQLserver)
  7. wemall单页化与wemall微分销
  8. vCenter6.0 U2空间清理
  9. 爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
  10. freeswitch的event事件处理