首页 > 其他分享 >【ZeroMQ 】ZeroMQ中inproc优势有哪些?与其它传输协议有哪些不同?

【ZeroMQ 】ZeroMQ中inproc优势有哪些?与其它传输协议有哪些不同?

时间:2024-11-08 16:48:50浏览次数:3  
标签:哪些 队列 worker inproc 线程 msg ZeroMQ zmq

inproc 是 ZeroMQ 提供的一种传输协议,用于在同一进程内的不同线程之间进行高效的通信。与其他传输协议(如 tcpipc 等)不同,inproc 专门针对线程间通信进行了优化,具有极低的延迟和开销。以下是 inproc 的底层原理和实现细节:

1. 内存共享

inproc 的核心原理是内存共享。由于 inproc 通信发生在同一进程内的不同线程之间,ZeroMQ 利用操作系统的内存共享机制,使不同线程可以直接访问同一块内存区域,而无需进行数据复制或跨进程通信。

  • 共享内存区域:ZeroMQ 在内部维护一个共享的内存区域,用于存储消息队列和其他通信相关的数据结构。
  • 指针传递:线程之间通过传递指向共享内存中消息的指针来进行通信,而不是复制数据。这种方式极大地提高了通信效率。

2. 消息队列

inproc 使用消息队列来管理线程之间的消息传递。每个 inproc 套接字都有自己的消息队列,消息队列是线程安全的,可以被多个线程同时访问。

  • 生产者-消费者模型:发送线程将消息放入消息队列,接收线程从消息队列中取出消息。
  • 无锁队列:为了提高性能,ZeroMQ 在内部实现了无锁队列(lock-free queue),这意味着在大多数情况下,线程可以无阻塞地访问消息队列,从而避免了锁的开销。

3. 上下文(Context)的作用

在 ZeroMQ 中,上下文(Context) 是一个全局对象,负责管理所有套接字和通信资源。对于 inproc 通信,所有线程必须共享同一个上下文。这是因为 inproc 通信依赖于上下文中的共享内存和消息队列。

  • 线程安全:ZeroMQ 的上下文是线程安全的,多个线程可以安全地创建和使用 inproc 套接字。
  • 资源管理:上下文负责管理 inproc 套接字的生命周期和资源,确保在所有线程完成通信后正确释放资源。

4. 套接字类型和消息传递模式

inproc 支持多种 ZeroMQ 消息传递模式,包括:

  • 请求-应答(REQ/REP)
  • 发布-订阅(PUB/SUB)
  • 管道(PUSH/PULL)
  • 对等(P2P)

这些模式在 inproc 中的实现与其他传输协议类似,但底层机制依赖于内存共享和消息队列。

5. 性能优化

inproc 的设计目标是提供极致的性能,因此它在以下几个方面进行了优化:

  • 避免数据复制:由于 inproc 使用内存共享和指针传递,数据不需要在发送和接收线程之间进行复制。
  • 无锁操作:使用无锁队列和其他无锁数据结构,避免了锁的开销。
  • 轻量级连接:由于 inproc 通信在同一进程内进行,连接和绑定的开销几乎可以忽略不计。

6. DEMO

以下是一个使用 inproc 进行线程间通信的简单示例:

#include <zmq.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void* worker_routine(void* arg) {
    void* context = zmq_ctx_new();
    void* worker = zmq_socket(context, ZMQ_REP);
    zmq_connect(worker, "inproc://workers");

    while (1) {
        zmq_msg_t request;
        zmq_msg_init(&request);
        zmq_msg_recv(&request, worker, 0);
        printf("Received request: %s\n", (char*)zmq_msg_data(&request));
        zmq_msg_close(&request);

        // 模拟一些工作
        sleep(1);

        const char* reply = "World";
        zmq_msg_t response;
        zmq_msg_init_size(&response, strlen(reply) + 1);
        memcpy(zmq_msg_data(&response), reply, strlen(reply) + 1);
        zmq_msg_send(&response, worker, 0);
        zmq_msg_close(&response);
    }

    zmq_close(worker);
    zmq_ctx_destroy(context);
    return NULL;
}

int main() {
    void* context = zmq_ctx_new();
    void* broker = zmq_socket(context, ZMQ_ROUTER);
    zmq_bind(broker, "inproc://workers");

    pthread_t worker;
    pthread_create(&worker, NULL, worker_routine, NULL);

    // 发送一个消息到 worker
    const char* request = "Hello";
    zmq_msg_t message;
    zmq_msg_init_size(&message, strlen(request) + 1);
    memcpy(zmq_msg_data(&message), request, strlen(request) + 1);
    zmq_msg_send(&message, broker, 0);
    zmq_msg_close(&message);

    // 接收来自 worker 的响应
    zmq_msg_t reply;
    zmq_msg_init(&reply);
    zmq_msg_recv(&reply, broker, 0);
    printf("Received reply: %s\n", (char*)zmq_msg_data(&reply));
    zmq_msg_close(&reply);

    pthread_join(worker, NULL);

    zmq_close(broker);
    zmq_ctx_destroy(context);
    return 0;
}

标签:哪些,队列,worker,inproc,线程,msg,ZeroMQ,zmq
From: https://blog.csdn.net/qq_37286579/article/details/143630638

相关文章

  • 算法定制LiteAIServer烟火识别软件烟火检测算法有哪些优势呢?
    在现代社会,随着人工智能技术的飞速发展,各种智能监控系统在公共安全、工业生产、环境保护等领域得到了广泛应用。其中,烟火检测作为预防火灾的重要手段,其准确性和实时性对于减少火灾损失、保障人民生命财产安全具有重要意义。摄像机实时接入分析平台LiteAIServer作为一款基于人工......
  • 构建AI大模型应用技术栈有哪些?
    摘要:随着人工智能技术的飞速发展,AI大模型已经成为推动各行各业技术革新的关键力量。本文将深入探讨AI大模型的核心技术栈的构建,以及不同技术组件的关键作用。AI大模型应用的核心技术栈各组件的关键作用基于大模型的应用和普通应用的区别01—AI大模型应用的核心技术栈......
  • 【鸿蒙生态崛起,开发者有哪些机遇与挑战?】HarmonyOS NEXT 引领数字化未来
    文章目录前言一、HarmonyOSNEXT特点与升级二、全面突破操作系统核心技术三、鸿蒙生态全面守护用户隐私四、鸿蒙生态的崛起与开发者机遇五、全新鸿蒙生态引领数字化未来小结前言鸿蒙系统不断发展,有与安卓、iOS形成三足鼎立之势,且其在智能手机、智能穿戴、车载、......
  • C# winform 的数据采集,采集周期是间隔10ms、100ms等等,但始终都有1ms的误差,并不是精准
    C#winform的数据采集,采集周期是间隔10ms、100ms等等,但始终都有1ms的误差,并不是精准的10ms,哪些原因呢在C#WinForms应用程序中进行数据采集时,如果遇到采集周期存在1ms误差的问题,可能的原因包括:Windows系统定时器精度:Windows系统的定时器默认精度是15.625ms,这意味着即使是......
  • 什么是Mes系统?Mes系统的功能和优点有哪些?
    MES(ManufacturingExecutionSystem),即制造执行系统,是位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统。MES系统的主要功能包括:生产计划与调度:能够根据订单需求和资源状况,制定合理的生产计划,并实时调整和优化生产调度。生产过程监控:对生产过程中的各......
  • 宝贝?你居然不知道Javabase有哪些知识,我这有一份为各位准备的《葵花宝典》哟!
    复习大纲文章目录复习大纲变量与类型运算符与输入器条件结构与随机数循环控制结构数组与集合循环嵌套变量与类型基本数据类型:Java中有多种基本数据类型,每种类型都有固定的内存大小和取值范围。整型byte:范围是从-128到127。short:范围是从-32768到32767。int......
  • C# 都有哪些集合?
    在C#中,集合(Collection)是用来存储一组数据的对象,通常是同一类型的数据。C#提供了多种不同类型的集合,每种集合都有其独特的特点和用途。常见的集合可以分为以下几类:数组、泛型集合、非泛型集合、其他集合类型、并发集合1.数组(Array)定义:数组是C#中最基本的集合类型,用......
  • 什么是CRM,CRM有什么作用,CRM主要功能有哪些?
    今天我们就开门见山的好好介绍一下CRM系统是什么?CRM系统有什么用?以及CRM的主要用途有哪些?本文没有套路,全是真情实感~首先,CRM是什么?CRM指的是客户关系管理,是CustomerRelationshipManagement的缩写。是一种通过建立和维护与客户的良好关系,提高客户满意度和忠诚度的管理平台。......
  • 高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?
    如果有遗漏,评论区告诉我进行补充面试官:RabbitMQ的使用场景有哪些?我回答:RabbitMQ是一个开源的消息代理和队列服务器,它遵循高级消息队列协议(AMQP)。RabbitMQ的核心作用是作为应用程序之间的中介,实现异步消息传递。它可以帮助解耦系统组件、提供消息的持久化、支持消息......
  • 2025年上半年软考高级科目有哪些?附选科指南
    新手在准备报考软考时,都会遇到这样的一个问题——科目这么多,我适合考什么?2025上半年软考高级有哪些科目可以报考?要想知道自己适合报什么科目,就需要了解每个科目是什么,考什么等一系列的问题,接着往下看2025年上半年,预计将有以下科目开考:1、信息系统项目管理师:信息系统项目管......