002 JavaClent操作RabbitMQ

news2024/9/25 17:19:15

Java Client操作RabbitMQ

文章目录

  • Java Client操作RabbitMQ
    • 1.pom依赖
    • 2.连接工具类
    • 3.简单模式
    • 4.工作队列模式(work)
      • 公平调度
      • 示例
    • 5.发布/订阅模式(fanout)
      • 交换机
      • 绑定
      • 示例代码
    • 6.路由模式(direct)
    • 7.Topic匹配模式

1.pom依赖

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.20.0</version>
</dependency>

2.连接工具类

/**
 * rabbitmq连接工具类
 * @author moshangshang
 */
@Slf4j
public class RabbitMQUtil {

    private static final String HOST_ADDRESS="192.168.1.102";
    private static final Integer PORT=5672;
    private static final String VIRTUAL_HOST="my_vhost";
    private static final String USER_NAME="root";
    private static final String PASSWORD="root";

    public static Connection getConnection() throws Exception {
        com.rabbitmq.client.ConnectionFactory factory=new com.rabbitmq.client.ConnectionFactory();
        factory.setHost(HOST_ADDRESS);
        factory.setPort(PORT);
        factory.setVirtualHost(VIRTUAL_HOST);
        factory.setUsername(USER_NAME);
        factory.setPassword(PASSWORD);
        return factory.newConnection();
    }

    public static void main(String[] args) {
        Connection connection = null;
        try {
            connection = getConnection();
        } catch (Exception e) {
            log.error("get rabbitmq connection exception....",e);
        }finally {
            try {
                if(connection!=null){
                    connection.close();
                }
            } catch (IOException e) {
                log.error("close rabbitmq connection exception....",e);
            }
        }
    }

}

3.简单模式

生产者投递消费到队列进行消费

在这里插入图片描述

消息发送

public class Send {

    private final static String QUEUE_NAME = "hello";


    public static void main(String[] argv) throws Exception {
        Connection connection = RabbitMQUtil.getConnection();
        try (Channel channel = connection.createChannel()) {
            //声明队列
            /*
             *  如果队列不存在,则会创建
             *  Rabbitmq不允许创建两个相同的队列名称,否则会报错。
             *
             *  @params1: queue 队列的名称
             *  @params2: durable 队列是否持久化
             *  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭
             *  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。
             *  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
             * */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

消息接收

因为希望在消费者异步监听消息到达时,当前程序能够继续执行,而不是退出。

因为提供了一个DeliverCallback回调,该回调将缓冲消息,直到准备使用它们。

public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
      Connection connection = RabbitMQUtil.getConnection();
      Channel channel = connection.createChannel();
      channel.queueDeclare(QUEUE_NAME, false, false, false, null);
      DeliverCallback deliverCallback = (consumerTag, delivery) -> {
          String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
          System.out.println(" [x] Received '" + message + "'");
      };
      channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
  }
}

4.工作队列模式(work)

生产者直接投递消息到队列,存在多个消费者情况

  • 创建一个工作队列,用于在多个工作人员之间分配耗时的任务。
  • 工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务,并必须等待其完成。相反,我们把任务安排在以后完成。我们将任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当你运行多个worker时,任务将在它们之间共享。
  • 这个概念在web应用程序中特别有用,因为在短的HTTP请求窗口内无法处理复杂的任务。
  • 默认情况下,消费者会进行轮询调度
  • RabbitMQ支持消息确认。消费者发送回一个确认,告诉RabbitMQ已经收到、处理了一条特定的消息,RabbitMQ可以自由删除它。
  • 如果一个消费者在没有发送ack的情况下死亡(其通道关闭、连接关闭或TCP连接丢失),RabbitMQ将理解消息未完全处理,并将其重新排队。如果同时有其他消费者在线,它将迅速将其重新传递给另一个消费者。这样,即使worker偶尔挂掉,也可以确保没有信息丢失。
  • 消费者交付确认时强制执行超时(默认为30分钟)。这有助于检测一直没有确认的消费者。
  • 默认情况下,手动消息确认已打开。在前面的示例中,我们通过autoAck=true标志明确地关闭了它们。一旦我们完成了一项任务,是时候将此标志设置为false并从worker发送适当的确认了。

在这里插入图片描述

公平调度

由于默认轮询调度,有些任务执行时间长,有些短,所以会导致部分worker压力大

使用预取计数=1设置的basicQos方法。这条消息告诉RabbitMQ一次不要给一个worker发送多条消息。在处理并确认前一条消息之前,不要向worker发送新消息。相反,它会将其发送给下一个不忙的worker。

int prefetchCount = 1;
channel.basicQos(prefetchCount);

示例

public class WorkProvider {

  private static final String TASK_QUEUE_NAME = "work_queue";

  public static void main(String[] argv) throws Exception {
      Connection connection = RabbitMQUtil.getConnection();
      try (Channel channel = connection.createChannel()) {
        channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
          for (int i = 0; i < 8; i++) {
              String message = String.valueOf(i);
              channel.basicPublish("", TASK_QUEUE_NAME,
                      MessageProperties.PERSISTENT_TEXT_PLAIN,
                      message.getBytes(StandardCharsets.UTF_8));
              System.out.println(" 消息发送 :'" + i + "'");
          }
    }
  }
}
public class WorkerConsumer1 {

  private static final String TASK_QUEUE_NAME = "work_queue";

  public static void main(String[] argv) throws Exception {
    final Connection connection = RabbitMQUtil.getConnection();
    final Channel channel = connection.createChannel();

    channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
    System.out.println(" 消息监听中。。。。。。");

    //控制ack流速,表示每次进行ack确认前只会处理一条消息
    //channel.basicQos(1);

    DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        //获取消息
        String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
        System.out.println("worker1 消息消费:'" + message + "'");
        try {
            doWork(message);
        } finally {
            System.out.println(" 执行结束。。");
            //消息确认,根据消息序号(false只确认当前一个消息收到,true确认所有比当前序号小的消息(成功消费,消息从队列中删除 ))
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    };
    //设置自动应答
    channel.basicConsume(TASK_QUEUE_NAME, false, deliverCallback, consumerTag -> { });
  }

}

消费者1的方法处理

  private static void doWork(String task) {
   
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ignored) {
                Thread.currentThread().interrupt();
            }
      
  }

消费者2的方法处理

  private static void doWork(String task) {
      return;
  }

启动两个worker消费者,执行结果如下(轮询):

在这里插入图片描述
在这里插入图片描述

若设置公平调度

channel.basicQos(1);

测试结果:

在这里插入图片描述
在这里插入图片描述

5.发布/订阅模式(fanout)

  • 不同于工作队列,同一消息在所有消费者共享,但只能有一个消费者消费,而发布订阅则会将同一消息发送给多个消费者,则将消息广播给所有订阅者

  • 在之前的模式中,都是直接将消息发送给队列,然后从队列消费,事实上之前使用了一个默认的交换机,即“”空字符串的

  • RabbitMQ消息传递模型的核心思想是生产者从不直接向队列发送任何消息。实际上,很多时候,生产者甚至根本不知道消息是否会被传递到任何队列。

  • 相反,生产者只能向exchange发送消息。exchange是一件非常简单的事情。它一方面接收来自生产者的消息,另一方面将它们推送到队列。exchange必须确切地知道如何处理它收到的消息。

在这里插入图片描述

将消息生产投递到exchange,由交换机去投递消息到队列

交换机

有几种exchange类型可供选择:directtopicheadersfanout。我们将专注于最后一个fanout

//创建交换机名称为logs
channel.exchangeDeclare("logs", "fanout");

  /**
    * exchange:交换机的名称
    * type:交换机的类型
    * durable 队列是否持久化
    * autoDelete:是否自动删除,(当该交换机上绑定的最后一个队列解除绑定后,该交换机自动删除)
    * internal:是否是内置的,true表示内置交换器。(则无法直接发消息给内置交换机,只能通过其他交换机路由到该交换机)
    * argument:其他一些参数
    */
 channel.exchangeDeclare(EXCHANGE_NAME,"fanout",false,false,false,null);

第一个参数是exchange的名称。空字符串表示默认或未命名的交换:消息将被路由到routingKey指定名称的队列(如果存在)。

channel.basicPublish( "logs", "", null, message.getBytes());

绑定

我们已经创建了一个fanout交换机和一个队列。现在我们需要告诉exchange向我们的队列发送消息。交换和队列之间的关系称为绑定。

交换机会向绑定的队列通过路由key将消息路由到指定的队列中,fanout分发不需要路由key

在这里插入图片描述

//其中,第一个参数为绑定的队列,第二个参数为绑定的交换机,第三个参数为路由key
channel.queueBind(queueName, "logs", "");
#列出所有得绑定
rabbitmqctl list_bindings

示例代码

public class FanoutProvider {

    //声明交换机
    public static final String EXCHANGE_NAME="fanoutTest";
    //声明队列
    public static final String QUEUE_NAME1="queue_name1";
    public static final String QUEUE_NAME2="queue_name2";


    public static void main(String[] argv) throws Exception {
      Connection connection = RabbitMQUtil.getConnection();
      try (Channel channel = connection.createChannel()) {
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME,"fanout",false,false,false,null);
          //声明队列
          channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
          channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
          //进行队列绑定
          channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"");
          channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"");
          String message = "fanout模式消息推送。。。。。";
          //消息推送
          //参数说明:交换机,路由key/队列,消息属性,消息体
          channel.basicPublish(EXCHANGE_NAME, "", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes(StandardCharsets.UTF_8));
          System.out.println(" 消息发送 :'" +message + "'");
    }
  }

}
public class FanoutConsumer1 {

    public static final String EXCHANGE_NAME="fanoutTest";

    public static final String QUEUE_NAME1="queue_name1";

      public static void main(String[] argv) throws Exception {
          Connection connection = RabbitMQUtil.getConnection();
          //创建信道
          Channel channel = connection.createChannel();
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
          //绑定队列
          channel.queueBind(QUEUE_NAME1, EXCHANGE_NAME, "");
          DeliverCallback deliverCallback = (consumerTag, delivery) -> {
              String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
              System.out.println(" fanout 消费者1:'" + message + "'");
          };
          channel.basicConsume(QUEUE_NAME1, true, deliverCallback, consumerTag -> {});
      }

}
public class FanoutConsumer2 {

    public static final String EXCHANGE_NAME="fanoutTest";

    public static final String QUEUE_NAME2="queue_name2";

      public static void main(String[] argv) throws Exception {
          Connection connection = RabbitMQUtil.getConnection();
          //创建信道
          Channel channel = connection.createChannel();
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
          //绑定队列
          channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, "");
          DeliverCallback deliverCallback = (consumerTag, delivery) -> {
              String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
              System.out.println(" fanout 消费者2:'" + message + "'");
          };
          channel.basicConsume(QUEUE_NAME2, true, deliverCallback, consumerTag -> { });
      }

}

6.路由模式(direct)

由交换机通过路由key绑定key进行消息推送,也可以将同一个路由key绑定到多个队列或所有队列,此时相当于fanout

如果推送消息的路由key不存在,则该消息会丢弃

public class DirectProvider {

    public static final String EXCHANGE_NAME="direct-exchange";
    public static final String QUEUE_NAME1="direct-queue";
    public static final String ROUTING_KEY="change:direct";

    public static void main(String[] argv) throws Exception {
      Connection connection = RabbitMQUtil.getConnection();
      try (Channel channel = connection.createChannel()) {
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME,"direct",false,false,false,null);
          //声明队列
          channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
          String message = "direct模式消息推送。。。。。";
          //参数说明:交换机,路由key/队列,消息属性,消息体
          channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes(StandardCharsets.UTF_8));
          System.out.println(" 消息发送 :'" +message + "'");
    }
  }

}
public class DirectConsumer {


    public static final String EXCHANGE_NAME="direct-exchange";
    public static final String QUEUE_NAME1="direct-queue";
    public static final String BINDING_KEY="change:direct";

      public static void main(String[] argv) throws Exception {
          Connection connection = RabbitMQUtil.getConnection();
          //创建信道
          Channel channel = connection.createChannel();
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME, "direct");
          //绑定队列
          channel.queueBind(QUEUE_NAME1, EXCHANGE_NAME, BINDING_KEY);
          DeliverCallback deliverCallback = (consumerTag, delivery) -> {
              String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
              System.out.println(" direct 消费者1:'" + message + "'");
          };
          channel.basicConsume(QUEUE_NAME1, true, deliverCallback, consumerTag -> { });
      }

}

7.Topic匹配模式

  • 发送到主题交换的消息不能有任意的路由key,它必须是一个由点分隔的单词列表。单词可以是任何东西,但通常它们指定了与消息相关的一些特征。一些有效的路由key示例:stock.usd.nyse、nyse.vmw、quick.orange.rabbit。路由密钥中可以有任意多的单词,最多255个字节。
  • 绑定key也必须采用相同的形式。topic交换机背后的逻辑类似于direct交换机,使用特定路由key发送的消息将被传递到所有使用绑定key绑定的所有队列。但是,绑定密钥有两个重要的特殊情况:
  • *(星号)只能代替一个单词
  • #(hash)可以替代零个或多个单词
public class TopicProvider {

    public static final String EXCHANGE_NAME="topic-exchange";
    public static final String QUEUE_NAME1="topic-queue";
    public static final String ROUTING_KEY="com.orange.test";
    public static final String ROUTING_KEY2="com.orange.test.aaa";

    public static void main(String[] argv) throws Exception {
      Connection connection = RabbitMQUtil.getConnection();
      try (Channel channel = connection.createChannel()) {
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC,false,false,false,null);
          //声明队列
          channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
          String message1 = "topic test模式消息推送。。。。。";
          String message2 = "topic test.aaa模式消息推送。。。。。";
          //参数说明:交换机,路由key/队列,消息属性,消息体
          channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message1.getBytes(StandardCharsets.UTF_8));
          channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY2, MessageProperties.PERSISTENT_TEXT_PLAIN, message2.getBytes(StandardCharsets.UTF_8));
          System.out.println(" 消息发送 :'" +message1 + "'");
          System.out.println(" 消息发送 :'" +message2 + "'");
    }
  }

}
public class TopicConsumer {


    public static final String EXCHANGE_NAME="topic-exchange";
    public static final String QUEUE_NAME1="topic-queue";
    public static final String BINDING_KEY="*.orange.#";


      public static void main(String[] argv) throws Exception {
          Connection connection = RabbitMQUtil.getConnection();
          //创建信道
          Channel channel = connection.createChannel();
          //声明交换机
          channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
          //绑定队列
          channel.queueBind(QUEUE_NAME1, EXCHANGE_NAME, BINDING_KEY);
          DeliverCallback deliverCallback = (consumerTag, delivery) -> {
              String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
              System.out.println(" topic 消费者1:'" + message + "'");
          };
          channel.basicConsume(QUEUE_NAME1, true, deliverCallback, consumerTag -> { });
      }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RQ-RAG:提升检索增强生成模型的查询精炼能力

人工智能咨询培训老师叶梓 转载标明出处 大模型在面对未见场景时&#xff0c;往往会产生不准确或虚构的回答&#xff0c;这限制了它们的实用性。为了解决这一问题&#xff0c;香港科技大学、香港理工大学和麻省理工学院的研究团队提出了一种名为RQ-RAG&#xff08;Retrieval-A…

国产芯片LT8711HE:TYPE-C/DP1.2转HDMI2.0转换器,4k60Hz高分辨率

以下为LT8711HE芯片的简单介绍&#xff0c;如有介绍不尽之处&#xff0c;请指出 LT8711HE是一个高性能的Type-C/DP1.2到HDMI2.0转换器&#xff0c;用于连接USB Type-C源或DP1.2源到HDMI2.0接收器。 LT8711HE集成了一个DP1.2兼容的接收器和一个HDMI2.0兼容的发射器。另外&…

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…

MOM成功实施分享(五)刨花板制造数字化聚焦业务场景

刨花板是一种人造板材&#xff0c;由木材或其他植物纤维原料制成。 在制造生产过程中目前存在以下痛点&#xff1a; 原材料质量不稳定&#xff1a;刨花板的质量很大程度上取决于原材料的质量&#xff0c;如果原材料的来源不稳定、质量参差不齐&#xff0c;会影响刨花板的性能…

从线段中搜寻提取闭合轮廓(三)

1.前言 做底层和数据的调试问题也是个麻烦事&#xff0c;如果没有方便的可视化工具辅助&#xff0c;那将令人感到痛苦&#xff0c;借助可视化的工具可以让我们高效、省心&#xff0c;进而心情舒畅&#xff0c;重要的是可以提高调试效率。 当然可视化工具也分不同层次的…

我对 monorepo 的一些思考

我对 monorepo 的一些思考 我对 monorepo 的一些思考 前言它的由来技术选型 管理工具语言与打包调试工具测试框架代码规范与质量控制本地引用与发包替换发包流程Github 相关配置部署 使用手册 功能特性总结如何使用&#xff1f;清除默认的包(可选)模板包介绍 packagesapps 更新…

25虾皮笔试shopee笔试测评sea笔试测评题型

虾皮笔试shopee笔试测评用的自己的笔试系统&#xff0c;全英文笔试&#xff1a; 1.Numerical Reasoning Test&#xff1a;10题&#xff0c;言语推断和数学计算 2. Verbal Reasoning Test&#xff1a;10题&#xff0c;言语理解&#xff0c;每题一段英文材料&#xff0c;选对错…

医院管理|基于java的医院管理系统小程序(源码+数据库+文档)

医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a;…

浅谈模型在信贷营销中的应用

浅谈模型在信贷营销中的应用 当前在信贷营销场景中,用户流量竞争愈加激烈,获客成本持续攀高,客户消费观念和消费信心趋向保守,传统的信贷营销方式效果逐渐乏力,借助数据挖掘技术对用户进行多元优化及精细化管理已经成为企业在经营发展中的普遍趋势。在此背景下,本文将围…

如何设置新建每个Python文件开头带上作者名和时间?

1、在pycharm界面中点击"File->Settings" 2、点击"Editor->File and Code Templates->Python Script" 3、添加信息后&#xff0c;点击"ok" # encoding: utf-8 # File : ${NAME}.py # Author: jianlu # Date : ${YEAR}/${MONTH}/${DA…

LBS 开发微课堂|轨迹重合率分析API升级:距离无上限,操作更简便

为了让广大的开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第二期的主题是 《轨迹重合率分析API升级》 百度地图的鹰眼轨迹…

算法设计(一)

1.汉诺塔 介绍 汉诺塔&#xff08;Hanoi Tower&#xff09;:它描述了如何将一堆大小不同、穿在一根柱子上的盘子移动到另一根柱子上&#xff0c;同时满足以下规则&#xff1a; 每次只能移动一个盘子。 每个移动盘子时&#xff0c;大的盘子不能放在小的盘子上面。 可以使用一根…

若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)

文章目录 一、开发脚手架选择二、RuoYi框架1、介绍2、版本发展3、为什么选择若依4、优缺点5、项目内置功能 三、后端项目部署1、拉取源码2、环境要求3、Maven构建4、MySQL相关&#xff08;1&#xff09;导入SQL脚本&#xff08;2&#xff09;配置信息 5、Redis相关&#xff08;…

crdownload格式后缀的文件是什么东西?crdownload格式是什么

crdownload格式就是浏览器没下载完成的文件&#xff0c;如果下载完成了&#xff0c;那么就显示正常的格式和文件名了。

ARM32开发——DMA

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 基础概念CPURAM外设 ARM32程序存储 执行过程取数据 执行操作流程总结 基础概念 CPU CPU&#xff08;Central Processing Unit&am…

[点云处理] cloud compare二次插件功能开发(三)CC插件总结与加速开发

本文完成一个点云变换的插件&#xff0c;同时也是对CC接口的使用做进一步说明&#xff0c;进一步理解CC插件开发流程&#xff0c;利用CC平台和已有代码加快实现定制功能。 这个功能在 cc 已有的功能已经存在&#xff0c;位于 edit->apply_transformation 这里 文件逻辑组织还…

如何让人工智能训练更快

影响人工智能训练时间的因素 在深度学习训练中&#xff0c;训练时间的计算涉及到多个因素&#xff0c;包括 epoch 数、全局 batch size、微 batch size、计算设备数量等。下面是一个基本的公式来说明这些参数之间的关系&#xff08;注意&#xff0c;这只是一个基本的说明公式&…

改变事件

窗口的某些属性的状态发生改变时就会触发该事件 对应的事件类型包括 QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange,QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEve…

【大模型基础】P2 Bag-of-Words

目录 词袋模型 概述词袋模型 实例第1步 构建语料库第2步 对句子进行分词第3步 创建词汇表第4步 转换词袋表示第5步 计算余弦相似度 词袋模型的局限性 词袋模型 概述 词袋模型&#xff0c;Bag-of-Words&#xff0c;是一种简单的文本表示方法&#xff0c;也是 NLP 中的一个经典模…

【Arcgis基础教程】GIS数据制备,空间分析与高级建模实践应用

随着信息技术的发展,数字地球、智慧地球等新概念的出现&#xff0c;人们对信息的需求日益提高&#xff0c;使得地理信息系统(GIS)在国民经济各个行业中获得了日益广泛的应用。尤其在当今大数据时代&#xff0c;面对海量的空间数据及个性化的地理信息服务&#xff0c;如何高效地…