ZMQ管道模型

2024-08-26 10:20
文章标签 模型 管道 zmq

本文主要是介绍ZMQ管道模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例一

生产者Producer

#include <zmq.hpp>
#include <iostream>
#include <string>
#include<chrono>
#include<thread>using namespace std;
using namespace zmq;int main() {context_t context(1);// 创建 PUSH 套接字,用于发送消息到代理socket_t push_socket(context, ZMQ_PUSH);push_socket.connect("tcp://localhost:8888");cout << "connect success" << endl;int i = 0;for (; ;) {string message = "Message " + to_string(++i);push_socket.send(buffer(message), send_flags::none);cout << "Sending: " << message << endl;this_thread::sleep_for(chrono::seconds(1)); // 休眠1秒}return 0;
}

队列queue()

#include <zmq.hpp>
#include <iostream>
#include <thread>
#include <chrono>// 休眠指定的时间长度using namespace std;
using namespace zmq;int main() {context_t context(2);// 创建 PULL 套接字,用于接收生产者的消息socket_t pull_socket(context, ZMQ_PULL);pull_socket.bind("tcp://*:8888");// 创建 PUSH 套接字,用于发送消息给消费者socket_t push_socket(context, ZMQ_PUSH);push_socket.bind("tcp://*:8889");cout << "bind success" << endl;while (true) {message_t message;pull_socket.recv(message, recv_flags::none);cout << "broken recv :" << message.to_string() << endl;// 睡眠一段时间模拟处理时间this_thread::sleep_for(chrono::seconds(1)); // 休眠1秒cout << "broken send :" << message.to_string() << endl;push_socket.send(message, send_flags::none);}return 0;
}```## 消费者(Consumer)```cpp
// client.cpp
#include <zmq.hpp>
#include <iostream>
#include <string>using namespace std;
using namespace zmq;int main() {context_t context(1);// 创建 PULL 套接字,用于接收代理发送的消息socket_t pull_socket(context, ZMQ_PULL);pull_socket.connect("tcp://localhost:8889");cout << "connect success" << endl;for (; ; ) {message_t message;pull_socket.recv(message, recv_flags::none);cout << "Received: " << message.to_string() << endl;}return 0;
}

编译

g++ -o server server.cpp `pkg-config --cflags --libs libzmq`
g++ -o client client.cpp `pkg-config --cflags --libs libzmq`
g++ -o queue queue.cpp `pkg-config --cflags --libs libzmq`

在这里插入图片描述

队列程序逻辑

队列作为管道需要接受来只上游生产者的消息,又需要发送消息给下游的消费者。

绑定端点

context_t context(1);// 创建 PULL 套接字,用于接收生产者的消息
socket_t pull_socket(context, ZMQ_PULL);
pull_socket.bind("tcp://*:8888");// 创建 PUSH 套接字,用于发送消息给消费者
socket_t push_socket(context, ZMQ_PUSH);
push_socket.bind("tcp://*:8889");

收发消息

        message_t message;pull_socket.recv(message, recv_flags::none);cout << "broken recv :" << message.to_string() << endl;// 睡眠一段时间模拟处理时间this_thread::sleep_for(chrono::seconds(1)); // 休眠1秒cout << "broken send :" << message.to_string() << endl;push_socket.send(message, send_flags::none);

生产者程序逻辑

连接管道

    context_t context(1);// 创建 PUSH 套接字,用于发送消息到代理socket_t push_socket(context, ZMQ_PUSH);push_socket.connect("tcp://localhost:8888");

发送消息

		string message = "Message " + to_string(++i);push_socket.send(buffer(message), send_flags::none);

消费者程序逻辑

连接管道

    context_t context(1);// 创建 PULL 套接字,用于接收代理发送的消息socket_t pull_socket(context, ZMQ_PULL);pull_socket.connect("tcp://localhost:8889");

接受消息

        message_t message;pull_socket.recv(message, recv_flags::none);

总结

在管道两边,可以有n个生产者,m个消费者,生产者的消息会以先进先出的顺序经过管道到达消费者,管道发给m个消费者的消息是负载均衡的。

这篇关于ZMQ管道模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1108284

相关文章

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf