ZeroMQ阅读笔记

[ZeroMQ] libzmq 源码阅读 之 Reactor机制(mailbox, event) [ZeroMQ] libzmq 源码阅读 之 Reactor机制(mailbox, event)ZeroMQ libzmq 源码阅读 之 Reactor机制mailbox event 信号员 signaler 进程间通信 signaler 实现 多路复用器poller 监听 socket mailbox IO Thread 总结 zmq在创建的时候回启动两类线程,一是应用线程(Application 阅读详情

ZeroMQ是一种基于消息队列的多线程网络库,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间。

ZeroMQ整体架构图如下:



ZeroMQ的主要特性是面向消息进行通信,所以它提供的是比Libevent处在网络通信中更高一层的组件,如果程序员要使用ZeroMQ,只需要做如下事情:

  • 告知所使用的通信模型,比如请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)等
  • 告知是用于机器之间,还是进程之间或线程之间的通信

然后程序员自己负责如何序列化/反序列化,最后将序列化后的数据交给ZeroMQ发送处理即可。


通过阅读ZeroMQ的源码,给我最深刻的印象就是ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞。ZeroMQ设计之初就是为了高性能的消息发送而服务的,所以其设计追求简洁高效,异步模式的体现在:

  • 传统的socket的connect函数为同步阻塞的,而ZeroMQ中设置成非阻塞的异步连接,调用zmq_connect方法返回并不代表连接就已经成功,由后台的I/O线程异步地进行,实际是由tcp_connecter_t执行真正的连接。
  • 调用zmq_send()方法时其实并没有真正将消息发送给套接字连接。消息会在一个内存队列中保存下来,并由后台的I/O线程异步地进行发送。如果不出意外情况,这一行为是非阻塞的。所以说,即便zmq_send()有返回值,并不能代表消息已经发送。当你在用zmq_msg_init_data()初始化消息后,你不能重用或是释放这条消息,否则ZMQ的I/O线程会认为它在传输垃圾数据。
  • ZeroMQ内部发送和接收消息时都并非同步执行的,待发送和接收的消息会分别在缓存在读写通道pipe中,最后触发poll读写事件。
  • ZeroMQ中应用层与IO线程之间的交互是通过command_t的命令对象的Lock-free的ypipe_t队列实现线程间通信。

它发送消息是异步模式,通过单独出一个IO线程来实现,所以消息发送调用之后不要立刻释放相关资源,要把资源释放函数交给ZeroMQ让ZeroMQ发完消息自己释放。

未完待续。。。




ZeroMQ通信程序基础实战指南 ZeroMQ(又称ØMQ、0MQ 或 zmq)是一个高性能的通信库,提供了丰富的通信模式和协议,用于进程或节点间的消息传递。它被设计用来构建高并发的网络服务并简化网络编程的复杂性。ZeroMQ 可以在多种网络协议上进行通讯,如 TCP、WebSocket、IPC 等。 阅读详情

相关推荐

ZeroMQ传输数据

C#代码最简单的调用ZeroMQ传输数据,传输文本信息,传输结构体数据,传输图像,完整代码,整理网络上的一些资料的应用。只是DLL版本是低版本的DLL库,并且是32位DLL库。

ZeroMQ从入门到掌握

一、ZeroMQ简述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。常用的通讯模式有三类: 请求回应模型 由请求端发起请求,并等待回应端回应请求。从请求端来看一定是一对对收发配对的;反之,在回应端一定是发收对。请求端和回应端都可以是 1:N 的模型。通常把 1 认为是 server ,N 认为是 Client 。ZeroMQ 可以很好的支持路由功能(实现路由功能的组件叫作 Device),把 1:N 扩展为 N:

Jiangtagong的博客 3653

ZeroMQ 使用指南(最新的版本)

ZeroMQ 使用指南,最新的版本,从入门到精通。支持请求应答、发布订阅等模式

ZeroMQ教程入门学习攻略

本人在zeromq使用过程中主要参考了如下博客。 1,概要和快速入门 https://www.cnblogs.com/chenny7/p/6245236.html 2,使用举例 https://blog.youkuaiyun.com/brimsullowr/article/details/82770444 3,架构分析 https://www.cnblogs.com/rainbowzc/p/335...

jigetage的专栏 6690

pgAdmin4备份恢复实战:从安装到避坑指南

本文提供了一份详尽的pgAdmin4备份恢复实战指南,涵盖从安装配置到执行备份恢复的全流程。针对Windows环境下的浏览器兼容性、二进制路径配置等常见问题,给出了具体解决方案。重点强调了使用pgAdmin4进行备份恢复的可靠性,特别是在处理包含PostGIS等扩展的数据库时,能有效避免数据类型和权限错误,确保数据迁移的完整性与安全性。

weixin_29266007的博客 439

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

消息队列和ZeroMQ原理和应用

消息队列(message queue)本质就是个队列,先进先出FIFO。 利用FIFO先进先出的特性,可以保证消息的顺序性。主要用途:不同服务server、进程process、线程thread之间通信。2.1 消息可靠性处理 在实际应用中,我们可以通过以下要点的设计来确保消息的可靠性处理:2.2消息吞吐量 模式比较: 1)REQ-ACK模式(无法提高吞吐量)2)多次send,一次ack模式(可以提高吞吐量)2.3 消息队列—流量控制 流量控制也称为削峰。这也在消息队列设计的时候需要考虑的要素。 削峰,水位到

木牛的博客 1908

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

本文详细介绍了如何使用AD9834 DDS模块DIY一个高精度可调信号源,涵盖硬件搭建、原理图解读、PCB优化和程序烧录等关键步骤。通过STM32控制实现0-10MHz频率范围输出,特别适合电子设计与射频实验,提供完整的AD原理图、PCB设计和程序代码参考。

weixin_31854867的博客 408

ZeroMQ云时代极速消息通信库--阅读笔记-第二章

1、第二章目录 说实话,读完了第二章,我也并没有对zeroMQ有一个更好更全面更深刻的理解,也还是仍然停留在表面上。 但,我将仍然会将自己的理解作为笔记供大家参考,也供自己理解 2、我的理解 这一章按照作者的说法,主要讨论了下面这些问题 后面会涉及到大量的zeroMQ的例子,因此,我将会在2.0的部分来说明如何建立自己的开发的环境 2.0 搭建zeroMQ的...

scottar的博客 636

SAP 未清PO数量 = 采购订单数量 - 已收货数量

本文介绍了SAP系统中查询未清PO数量的6种方法:1.标准采购报表(ME2L/ME2M/ME2N)适合业务用户快速查询;2.物料需求报表(MD04)可查看单个物料的供需情况;3.SQVI快速查询器提供自定义字段的灵活性;4.ABAP报表适合开发人员处理复杂逻辑;5.SAPQuery经配置后可供业务用户使用;6.BI/HANA方案适合大数据量分析。每种方法各有优缺点,用户可根据自身技术水平和具体需求选择,日常查询推荐使用标准采购报表ME2L/ME2M。

金牌架构师 1857

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

ZeroMQ云时代极速消息通信库--阅读笔记-第一章

0. 说在前面的话 本人是研究生在读二年级,打算利用接下来的一个月的时间用这个zeroMQ做一些事情(实际上,并不一定是zeroMQ,或者nanomsg),之前,对zeroMQ的了解还是很浅显,因此,我希望能够i通过阅读这本书,来提高自己对zeroMQ的认识。我的做法是将我对每一章的内容进行阅读,然后针对每一章的内容,总结出自己的理解 1. 目录 第一章的主要的内容:主要是下面的...

scottar的博客 454

3大绝招!MySQL如何轻松搞定文本、图像和视频的多模态数据分析?

首先,让我们来了解一下“多模态”到底是什么意思。简单来说,多模态指的是能够同时处理不同类型数据(如文本、图像、音频等)的能力。传统的数据库往往只能专注于一种或几种特定类型的数据,比如关系型数据库主要处理结构化数据,而文档型数据库则更适合非结构化数据。但是现在,随着技术的进步,像MySQL这样的数据库也开始支持更加复杂的数据模型,允许我们在同一个系统内处理多种格式的数据。通过上述五个部分的详细介绍,相信你现在应该对如何利用MySQL进行多模态数据分析有了更清晰的认识。

java专栏 2116

ZeroMQ云时代极速消息通信库--阅读笔记-第三章

高级请求-应答模式 0、说在前面的话 个人认为这一章,才算是比较真正的讲述zeroMQ的主要处理信息的原理,但是也还是没有嵌入到内部,首先,第一遍阅读可能会觉得比较晕,因为我们之前了解的模式实际上已经能够做很多事情了。 但是,我们在这个基础上做事情的话, 总是感觉有一种不安的感觉,因为我几乎不知道我到底在干嘛,当我读了这一章的时候,才对自己有了一点点的信心。 我能...

scottar的博客 1322

算法 | 基于灰狼优化算法的无人机三维路径规划方法研究(附matlab代码)

针对复杂环境下的无人机三维路径规划问题,本文提出一种基于灰狼优化算法(Grey Wolf Optimizer, GWO)的解决方案。通过模拟灰狼群体的社会等级与协作捕猎机制,结合动态参数调整策略,优化路径长度与避障性能。实验表明,相较于粒子群优化(PSO)和遗传算法(GA),GWO算法在收敛速度与路径成本上分别提升约25%和18%,且在三维城市地形中表现出更强的避障鲁棒性。本文提供完整的MATLAB代码实现,为无人机自主导航提供理论与技术支撑。

尘世冰封的专栏 287

构建.NET网站:VSCode还是Visual Studio?揭开开发工具的选择之谜

选择VSCode还是Visual Studio,归根结底是取决于你的具体需求和偏好。🔍 这两款工具各有千秋,都能为你的.NET网站开发提供强大的支持。希望这篇文章能够帮助你更全面地了解这两款工具,做出明智的选择。

墨夶的博客 788

ZeroMQ云时代极速消息通信库--阅读笔记-第四章

1、本章学习内容 客户端请求-应答 最近最少使用队列 心跳机制 面向服务的队列 基于磁盘(脱机)队列 主从备份服务 无中间件的请求-应答 2、我的个人理解 2.1 什么是可靠性 容易出现的故障的类型如下,那么可靠性,就是在很大程度上不希望出现下面的这些情形 应用程序代码是最大的故障来源。程序会崩溃或中止,停止对数据来源的响应,或是响应得太慢,耗尽内存等。...

scottar的博客 752

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ZeroMQ云时代极速消息通信库--阅读笔记-第五章

1、本章学习内容--高级发布-订阅模式 处理慢订阅者(自杀的蜗牛模式) 高速订阅者(黑箱模式) 构建一个共享键值缓存(克隆模式) 2、我的个人理解 2.1 检测慢订阅者 如何处理慢订阅者?最好的方法当然是让订阅者高效起来,不过这需要额外的工作。以下是一些处理慢订阅者的方法: 在发布者中贮存消息。这是Gmail的做法,如果过去的几小时里没有阅读邮件的话,它会把邮件保存起...

scottar的博客 417

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

源码该如何阅读?学习的源码的意义何在?

很多人觉得具备阅读代码能力的人很牛逼,自己也试着做过阅读,但发现一掉进去总是会迷失方向却最后无所获取,不知道该如何正确阅读代码,这里整理的大神网友对阅读源码的一些心得,希望能对大家有帮助,内容整理于网络,侵删。 来源知乎:https://zhuanlan.zhihu.com/p/38341879 最近有朋友突然问我一个问题 “你怎么把UE4引擎代码看的那么深入的?” 看到问题后我还愣了一下,因为这是第一次有人给我打了个"深入UE4"的标签。其实我接触虚幻引擎满打满算也就两年,确实谈不上深入。只是靠着.

技术Q君样:202432010的博客 763

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ZeroMQ源码阅读阶段性总结

文章目录Data Structor —— ZMQ的最快底层Own tree —— ZMQ的安全销毁机制own_t 基类参考资料Command Flow —— ZMQ如何实现内部的命令传递序:ZMQ中command与message的区别基类:command_t —— 真正的命令mailbox_t的前置技能:mutex_t(同步锁)mailbox_t的前置技能:signaler_t(信号机)核心类:m...

yashem66 1808

ZeroMQ 源码阅读

一、创建contextzmq_ctx_new()context 干嘛用的?context 是用于管理全局状态的,例如sockets, io_thread, repear等。下面是zmq内部结构白皮书的解释: To prevent this problem libzmq has no global variables. Instead, user of the library is respons

骚铭科技SM-Tech! 758

zeromq解决了什么问题

zeromq解决了什么问题

Welcom to zougangx's blog 6974

深入理解 消息队列 与 ZeroMQ

消息队列(Message Queue,MQ)** 本质是一个满足 *FIFO* 规则的队列,队列元素是 *message*,用于进程 / 线程 / 服务之间的异步通信。 引入 MQ 的根本目的

人心有反复,好在山水有重逢。 2414

进程间通信组件ZeroMQ详解

在一些复杂的项目中,往往会由不同功能的程序组成,且在程序运行期间,各个程序还需要进行互相通信,实现进程间通信的方式有很多种,最常用的就是通过消息中间件,比如RabbitMQ,Kafka,以及ZeroMQ等,而RabbitMQ和Kafka这两款中间件往往都需要独立安装步骤才能使用,ZeroMQ却不需要独立安装部署,而是作为动态库直接在程序中引用即可。今天以一个简单的小例子,简述ZeroMQ的常见用法,仅供学习分享使用,如有不足之处,还请指正。

绳锯木断,水滴石穿,专心写文,无问西东!!! 2018

接触ZeroMQ

首次接触ZeroMQ就被其惊人的通信速度和接口的易用性给吸引,尤其是阅读ZeroMQ指导的开题部分,不得不为这些老外的思维所折服,最令我深刻感受的几句话: 今天,我们遇到了另一个软件危机,但是我们对这个话题谈论的不多。只有最大,最有钱的公司能够建立连接的应用程序。虽然有云端运算网络,但是它是私有的。我们的数据 、知识从我们的电脑里消失,进入我们不能访问、不能竞争的云网络,谁拥有我们的社会网络?相

gecko3000的专栏 1891
上一篇: 高性能的通讯库-ZeroMQ的几个高性能特征
下一篇: Netty之源代码解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值