【RabbitMQ】RabbbitMQ的六种工作模式以及代码实现

news2024/11/27 9:53:25

目录

一、交换机类型

二、简单模式

1、介绍

2、代码实现 

三、Work Queues工作队列模式

1、介绍

2、代码实现

四、Pub/Sub订阅模式

1、介绍

2、代码实现

五、Routing路由模式

1、介绍

2、代码实现

六、Topics通配符模式

1、介绍

2、代码实现


一、交换机类型

在之前的文章里我们了解了什么是交换机,当有生产者把消息发给MQ服务器时,消息会通过交换机分发给不同的消息队列里,那么交换机是如何分发消息的,我们就需要了解交换机的几种类型

类型说明
fanout广播类型,交换机会把收到的消息分发给每一与他绑定的队列
direct定向类型,交换机会根据路由将消息分发给与它绑定的指定的匹配队列
topic通配符类型,交换机会根据通配符匹配后分发给与他绑定的指定的匹配队列

二、简单模式

1、介绍

RabbitMQ的简单模式是一对一即,一个生产者生产消息后不经交换机直接给指定的队列供消费者消费

2、代码实现 

他的不需要交换机进行分发,所以我们代码实现整体过程为

生产者:建立连接-》创建队列-》构造发送消息-》关闭连接

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String QUEUE = "easyQueue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接 获取连接通道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare(QUEUE,true,false,false,null);

        // 4.发送消息
        String body = "hello mq";
        channel.basicPublish("",QUEUE,null,body.getBytes());

        // 5.关闭连接
        channel.close();
        connection.close();
    }
}

运行代码即可发送消息到服务器 

消费者:建立连接监听队列获取消息



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private static final String QUEUE = "easyQueue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者消费消息:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE,true,consumer);
    }
}

 运行代码

完成消费,这就是RabbitMQ工作模式的简单模式,他不需要交换机来去对消息进行分发 

三、Work Queues工作队列模式

1、介绍

工作队列模式相比简单模式,他的处理任务速度在一定情况下会更快,因为他相比简单模式单一消费者而言它增加了消费者个数

2、代码实现

它同样也不需要交换机对收到的消息进行分发,代码实现与简单模式基本相同,唯一不同点是他相比简单模式多了一个消费者

生产者



import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String QUEUE = "workQueue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接 获取连接通道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare(QUEUE,true,false,false,null);

        // 4.发送消息
        String body = "hello mq";
        channel.basicPublish("",QUEUE,null,body.getBytes());

        // 5.关闭连接
        channel.close();
        connection.close();
    }
}

消费者1



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private static final String QUEUE = "workQueue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者消费消息:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE,true,consumer);
    }
}

 消费者2:



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private static final String QUEUE = "workQueue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者消费消息:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE,true,consumer);
    }
}

四、Pub/Sub订阅模式

1、介绍

他相比之前两种模式引入了交换机,当MQ服务器收到消息后,交换机会把收到的消息分发给每一个绑定了该交换机的队列给不同的消费者进行消费,之前的文章里我们是通过控制台进行队列与交换机的绑定,这里我们会使用Java代码来进行绑定

 比如当用户下单后我们需要去给用户通过邮箱以及短信发送回购优惠券信息时,我们就可以通过该模式,分别创建邮箱队列以及短信队列,然后生产者将用户信息发给MQ服务器经过交换机进入邮箱与短信队列让不同的消费者去消费通知。

2、代码实现

与前两种模式不同的时,我们在实现该模式的生产者时建立连接后需要去创建交换机,由于交换机不同的类型其工作模式不同,所以我们创建交换机时 需要去指定他的类型,创建完成后我们还需要去将邮箱队列与短信队列与该交换机进行绑定

创建交换机需要使用该方法exchangeDeclare

参数说明
exchange交换机名
type交换机类型
durable是否持久化到内存,一般为true
autoDelete是否自动删除,一般为false
internal内部使用参数,一般为false
arguments参数信息,一般为null

队列绑定交换机需要用到这个queueBind(队列名,交换机名,路由名--如果交换机类型为fanout则为空字符串)方法

生产者:



import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String EXCHANGE_NAME = "pubSubExchange";
    private static final String EMAIL_QUEUE = "email";
    private static final String SMS_QUEUE = "sms";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT,true,false,false,null);

        // 4.创建队列
        channel.queueDeclare(EMAIL_QUEUE,true,false,false,null);
        channel.queueDeclare(SMS_QUEUE,true,false,false,null);

        // 5.绑定交换机
        channel.queueBind(EMAIL_QUEUE,EXCHANGE_NAME,"");
        channel.queueBind(SMS_QUEUE,EXCHANGE_NAME,"");

        // 6.发送信息
        channel.basicPublish(EXCHANGE_NAME,"",null,"hello".getBytes());

        // 7.关闭连接
        channel.close();
        connection.close();
    }
}

运行查看服务器 

 此时两个消费者只需修改监听的队列即可

email消费者:



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class EmailConsumer {
    private static final String EMAIL_QUEUE = "email";
    private static final String SMS_QUEUE = "sms";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("邮件已发送" + new String(body));
            }
        };
        channel.basicConsume(EMAIL_QUEUE,true,consumer);
    }
}

运行代码 

sms消费者:



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class EmailConsumer {
    private static final String EMAIL_QUEUE = "email";
    private static final String SMS_QUEUE = "sms";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("已发送" + new String(body));
            }
        };
        channel.basicConsume(SMS_QUEUE,true,consumer);
    }
}

五、Routing路由模式

1、介绍

上述用户下单发送回购优惠券需求时,如果有的用户他注册时没有设置邮箱或者电话,我们不需要去给没有的邮箱发送,此时使用订阅模式是不可取的,使用路由模式是可行的,那么为什么路由模式可以呢,让我们来看。路由模式与订阅模式相同的是都需要使用交换机,不同的是当收到生产者的消息时,订阅模式会分发给每一个与之绑定的队列,而路由模式则不同,他会按照消息指定的路由去匹配到相应的队列从而发送给指定的队列

2、代码实现

由上述路由模式图,我们在发送消息前,需要先创建一个交换机且路由模式交换机类型不在是fanout而是direct路由模式,还需要去创建队列,然后绑定交换机,在绑定交换机的时候我们需要去给队列设置对应的路由,且在发送消息时指定路由

生产者:



import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String EXCHANGE_NAME = "rout-ex";
    private static final String EMAIL_QUEUE = "email";
    private static final String SMS_EMAIL = "sms";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT,true,false,false,null);

        // 4.创建队列
        channel.queueDeclare(EMAIL_QUEUE,true,false,false,null);
        channel.queueDeclare(SMS_EMAIL,true,false,false,null);

        // 5.绑定交换机
        channel.queueBind(EMAIL_QUEUE,EXCHANGE_NAME,"email");
        channel.queueBind(SMS_EMAIL,EXCHANGE_NAME,"sms");

        // 6.发送消息
        channel.basicPublish(EXCHANGE_NAME,"email",null,"routing".getBytes());

        // 7.关闭连接
        channel.close();
        connection.close();
    }
}

发送消息指定了路由为email,此时我们运行代码查看服务器

消费者:

修改监听队列名即可



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        // 2.设置参数:队列、交换机、虚拟机、端口、IP
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/DemoVirtualHost");
        connectionFactory.setUsername("1886");
        connectionFactory.setPassword("1886");

        // 3.建立连接 Connection ---- channel
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();

        // 4.获取消息
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("email消费");
            }
        };
        channel.basicConsume("email",true,consumer);

    }
}

 

六、Topics通配符模式

1、介绍

上述路由模式我们知道了消息可以指定路由进而到达指定的队列,但路由只有一个所以该消息只能进入一个队列,而后续如果有一个消息需要进入几个队列的需求时订阅模式与路由模式就不能完成,此时我们可以使用通配符模式进行匹配,而该模式的交换机类型为通配符类型的topic。

通配符有两种

种类介绍
*(system.*)*指的是匹配一个单词,(system.*)是指路由前缀为system.且后面有一个单词即可
#(#.error)#指的是匹配0个或多个单词,(#.error)是指路由前面没有或有若干单词,后面为.error

如果此时服务器有两个队列一个为存放所有分布式系统的error日志,一个只用于存放A系统的所有等级日志 ,此时前者路由配置为#.error,后者可为A.*

2、代码实现

生产者:

我们实现上述业务时可对队列进行上述路由配置,此时我们将消息路由设置为B系统下的error日志:B.error,该消息就会进入error队列



import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String EXCHANGE_NAME = "topic-ex";
    private static final String ERROR_QUEUE = "error";
    private static final String SYSTEM_LOG = "a-system-logging";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC,true,false,false,null);

        // 4.创建队列
        channel.queueDeclare(ERROR_QUEUE,true,false,false,null);
        channel.queueDeclare(SYSTEM_LOG,true,false,false,null);

        // 5.绑定交换机
        channel.queueBind(ERROR_QUEUE,EXCHANGE_NAME,"#.error");  // 所有系统的error日志
        channel.queueBind(SYSTEM_LOG,EXCHANGE_NAME,"A.*");       // A系统的所有日志

        // 6.发送消息
        channel.basicPublish(EXCHANGE_NAME,"B.error",null,"b系统的error日志".getBytes());

        //  7.关闭连接
        channel.close();
        connection.close();
    }
}

消费者:

消费者只需要修改监听的队列名即可



import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建连接工厂 配置工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.监听队列获取消息
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("处理日志" + new String(body));
            }
        };
        channel.basicConsume("error",true,consumer);

    }
}

 运行代码即可查看

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

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

相关文章

uniapp开发,打包成H5部署到服务器

前端使用uniapp开发项目完成后,需要将页面打包,生成H5的静态文件,部署在服务器上。 这样通过服务器链接地址,直接可以在手机上点开来访问。 打包全步骤如下: 1、修改config.js内的请求地址 需要后台部署到测试服务器上…

项目进度管理软件的应用可以解决哪些问题

项目管理工具够满足了项目经理对项目资源:时间、人员和文档的管理,同时也提高了项目的可视化和促进了团队的协作。 项目进度管理要求在规定的时间内,通过合理的进度计划,在计划执行过程中,要检查实际进度是否按计划要…

PasteSpider之项目环境-同步过滤-键值配置介绍

项目环境 在菜单项目信息项目环境 中,在PasteSpider中项目->服务->环境,也就是服务是不能运行的,得绑定环境,比如开发环境,测试环境。通过这个概念你可以实现不同得人部署不同的环境,他们之间公用同版…

ChatGPT之父:未训练GPT-5

GPT等大型语言模型带动的芯片需求飙升趋势依然没有平息的迹象,英伟达的最新版旗舰AI芯片H100近日在网上的售价已经被炒到4万多美金,反映了科技行业对训练和部署人工智能软件的需求仍未被满足。 一、商业圈 1.马斯克成立新AI公司硬刚OpenAI 当地时间4月…

大屏开发需要知道哪些知识

大屏 大屏是什么呢?再我前几年刚接触这个词得时候很新颖,全名叫态势感知大屏,大屏得特点是炫酷、好看,给用户满满得科技感。 听一位前辈说当年再招标会上,再都用exel、word做界面图表文档得时候,有一家公司…

使用MyBatis实现条件查询

文章目录一,查询需求二,打开MyBatisDemo项目三,对学生表实现条件查询(一)创建学生映射器配置文件(二)在MyBatis配置文件里注册学生映射器配置文件(三)创建学生映射器接口…

kaggle数据集下载

一、首先需要安装kaggle winR→cmd→pip install kaggle 问题:安装到哪来?都说在c盘。可是我找不到,可能因为之前担心c负荷更改路径了,再安装一下发现已经安装成功,且给出了安装路径。 二、注册 (1387条消息) 最新k…

VS Code 最新 Java 编码体验更新

大家好,欢迎来到我们的三月更新!我们将为您带来一系列基础编码体验的改进,例如运行 Java 程序的更流畅体验、AWT 项目相关的代码补全优化以及更好的 Spring Boot 项目与 Azure 的集成,让我们开始吧! 运行 Java 程序的用…

开启虚拟机出现报错:“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录报错原因解决方式(这里以联…

Python办公自动化之PostgreSQL篇1——PostgreSQL安装(保姆级教程)

我们在办公中会经常用到数据量比较大的表,打开、保存都会相对比较卡顿。那么我们可以安装一个PostgreSQL,然后利用Python进行读取,或者再写入。最后可以将最终的数据表进行导出。 肯定会有小伙伴问,那么利用MySQL不行吗&#xff…

wps宏编辑器-js宏录制运行

WPS开放平台如下描述JS宏录制和运行。 WPS宏编辑器提供了一个自动生成JS代码的功能,即录制宏。录制宏功能通过宏录制器捕捉用户与WPS交互的操作,并以JS代码的形式记录下来,整个过程是自动的,不需要用户写代码。在实际的WPS二次开发…

D. Odd-Even Subsequence(二分 + 奇偶下标的取法)

Problem - D - Codeforces Ashish有一个大小为n的数组a。A的子序列被定义为一个序列,该序列可以通过删除一些元素(可能是不删除)从A中获得,而不改变剩余元素的顺序。考虑a的子序列s。他将s的代价定义为以下两者之间的最小值:在s的奇数指数下所有元素中的…

SAR ADC系列27:实践讲解1

Latch比较器Noise仿真 比较器后面加RS触发器,当比较器复位时,OUTP和OUTN输出为11,RS触发器锁存;当比较器比较时,OUTP和OUTN输出一正一负,RS触发器相当于反相器。 做法:改变Vin的值,…

SAM(Segment Anything Model)让CV走到尽头?学CV的研究生还能正常毕业吗?怎么使用SAM?

SAM(Segment Anything Model)让CV走到尽头?学CV的研究生还能正常毕业吗?怎么使用SAM? 1. 引言 最近无论是在B站、知乎还是论坛、微博,都看了一些有关SAM的讨论。这个号称“CV界ChatGPT”的模型从出生起就…

x86中断基础

x86中断基础 原文:Basic x86 interrupts 作者:Alex Dzyoba 原文发表日期:2016年4月2日 在我的关于多重引导内核的文章中,我们看到了如何加载内核、打印文本,然后停止。然而要让操作系统可用,需要支持键…

[chapter 26][PyTorch][MNIST 测试实战】

前言 这里面结合手写数字识别的例子,讲解一下训练时候注意点 目录 训练问题解决方案参考代码一 训练问题 训练的时候,我们的数据集分为Train Data 和 validation Data。 随着训练的epoch次数增加,我们发现Train Data 上精度 先逐步增加,但…

协议篇之以太网ARP协议

协议篇之以太网ARP协议一、什么是ARP协议?作用是什么?二、ARP请求与ARP应答三、以太网ARP数据报格式四、总结一、什么是ARP协议?作用是什么? ARP(Address Resolution Protocol),地址解析协议&am…

GUID分区与MBR分区有什么区别? 操作系统知识

GUID分区与MBR分区有什么区别? 操作系统知识 1、MBR分区表类型的磁盘 主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要…

以ChatGPT为例进行自然语言处理学习——入门自然语言处理

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

Python办公自动化之PostgreSQL篇2——利用Python连接PostgreSQL并读取一张表

在上一篇我们已经安装好了最新的PostgreSQL,以及最方便的可视化工具,Navicat 如果错过的小伙伴,可以去上一篇查看:点我查看 今天我们来用Python连接一下PostgreSQL,然后准备一张测试表,导入PostgreSQL&am…