当前位置: 首页 > news >正文

第二十二章 : Spring Boot 集成定时任务(一)

第二十二章 : Spring Boot 集成定时任务(一)

前言

本章知识点: 介绍使用Spring Boot内置的@Scheduled注解来实现定时任务-单线程和多线程;以及介绍Quartz定时任务调度框架:简单定时调度器(SimpleSchedule)和Cron表达式调度器(CronSchedule)来调度触发的定时任务。

Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 24.2

场景

  1. 系统维护:操作系统和各种软件通常需要定期进行更新和打补丁。通过定时任务,这些更新可以在预定时间自动进行,无需人工干预。
  2. 文件同步:在多个设备或服务器之间同步文件时,可以使用定时任务来确保文件的一致性。例如,使用cron在Linux系统上定期同步文件夹。
  3. 发送通知或警报:许多系统需要定期发送通知或警报,如系统状态报告,警报阈值越过通知等。这些可以通过定时任务来实现。
  4. 数据抽取和加载:在大数据环境中,通常需要从不同的数据源抽取数据,并将其加载到数据仓库或分析系统中。定时任务可以定期执行这些操作。
  5. 测试和监控:定期进行系统或应用的健康检查,性能测试等,以便及时发现问题并进行修复。
  6. 日志清理:定期清理过期的日志文件,以防止磁盘空间被耗尽。
  7. 网关定期同步:对于需要和远程系统进行同步的网关服务,定时任务可以帮助实现数据的定期更新。
  8. 定期重新启动服务:某些服务可能需要定期重新启动以保持良好的性能。定时任务可以执行这个操作。
  9. 定期更新统计信息:在各种系统中,统计信息的及时更新对于决策制定和性能优化都非常重要。定时任务可以帮助实现这个需求。

Spring Boot定时任务的方式

Spring Boot提供了两种实现定时任务的方式:

1) 一种是Spring Boot内置的注解方式,只需在类上增加@Scheduled即可实现;

2)另一种是基于Quartz实现,Quartz是目前完善的定时任务解决方案,适合处理复杂的应用场景。

@Scheduled定时任务
参数说明
  1. value:指定计划任务的时间间隔。可以是固定时间间隔的字符串表示,例如"0 0/5 * * * ?"表示每5分钟执行一次。也可以是cron表达式,例如"0 0 12 * * ?"表示每天中午12点执行。
  2. fixedRate:固定速率,表示任务以固定的时间间隔执行。如果设置了该参数,那么方法会在每隔一定时间间隔后执行一次。与value参数类似,参数值可以是固定的时间间隔字符串或cron表达式。
  3. fixedDelay:固定延迟,表示任务在完成一次执行后,等待一定的延迟时间再执行下一次。与value参数类似,参数值可以是固定的时间间隔字符串或cron表达式。
  4. initialDelay:初始延迟,表示任务在启动后需要等待一定的延迟时间才开始执行。参数值可以是固定的时间间隔字符串或cron表达式。
  5. cron:cron表达式,用于指定任务的执行时间。可以精确到秒级别。例如,"0 0 12 * * ?"表示每天中午12点执行。
  6. timezone:时区,用于指定任务的执行时间。该参数通常与cron表达式一起使用,以确定任务在特定时区中的执行时间。
  7. threadName:线程名称,用于指定执行任务的线程名称。如果未设置该参数,则默认使用"ScheduledThreadExecutor"。
  8. inheritable:是否可继承,表示是否允许子类继承该注解的设置。默认为false。
  9. stateful:是否状态保持,表示是否在每次执行任务时都保持状态。默认为false。
  10. jobName:任务名称,用于指定计划任务的名称。如果未设置该参数,则默认使用方法名称作为任务名称。
  11. jobGroup:任务组,用于将相关的计划任务分组在一起执行。如果未设置该参数,则默认使用方法所属的类作为任务组。
代码示例

Spring Boot提供了内置的@Scheduled注解实现定时任务的功能。使用@Scheduled注解创建定时任务非常简单,只需几行代码即可完成。

注意:默认情况下,Spring Boot定时任务是单线程方式执行的。

如果同一时刻有两个定时任务需要执行,那么只能在一个定时任务完成之后再执行下一个。

如果只有一个定时任务,这样做肯定没问题;当定时任务增多时,如果一个任务被阻塞,则会导致其他任务无法正常执行。要解决这个问题,需要配置任务调度线程池。

单线程定时任务
  1. 创建定时任务类

    首先创建SchedulerTask类,然后在任务方法上添加@Scheduled注解,@EnableScheduling开启定时任务,具体的代码如下:

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
    import java.util.Date;
    @EnableScheduling
    @Component
    @Slf4j
    public class SchedulerTask {@Scheduled(cron="*/10 * * * * ?")protected void taskCron(){SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");log.info("现在时间Scheduled1: {}" , dateFormat.format(new Date()));}
    }
    
  2. 启动项目

    创建好SchedulerTask定时任务后启动项目,查看后台任务的运行情况,如图22-1所示。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "org.sea.example.day14.task")
    public class SpringbootDay14Application {public static void main(String[] args) {SpringApplication.run(SpringbootDay14Application.class, args);}}
    

    在这里插入图片描述

    ​ 图22-1 后台定时任务执行日志

    后台日志显示,SchedulerTask任务每隔10秒输出当前时间,说明定义的任务正在后台定时执行

多线程定时任务
  1. 增加多线程配置类

    增加SchedulerConfig配置类,代码如下:

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;
    @Configuration
    @Slf4j
    public class SchedulerConfig {@Beanpublic Executor asyncTaskScheduler() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(3);executor.setMaxPoolSize(10);executor.setQueueCapacity(3);executor.initialize();log.info("多线程配置类初始化");return executor;}
    }
    

    设置执行线程池为3,最大线程数为10。

  2. SchedulerTask定时任务

    在类上增加@EnableAsync注解,在方法上增加@Async注解,使得后台任务能够异步执行,代码如下:

    mport lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
    import java.util.Date;@EnableAsync
    @EnableScheduling
    @Component
    @Slf4j
    public class SchedulerAsyncTask {@Async@Scheduled(cron="*/10 * * * * ?")protected void task1(){SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");log.info("现在时间Scheduled1: {}" , dateFormat.format(new Date()));}@Async@Scheduled(cron="*/10 * * * * ?")protected void task2(){SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");log.info("现在时间Scheduled2: {}" , dateFormat.format(new Date()));}@Async@Scheduled(cron="*/10 * * * * ?")protected void task3(){SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");log.info("现在时间Scheduled3: {}" , dateFormat.format(new Date()));}
    }
    

    ​ 在上面的示例中,定时任务类SechedulerTask增加了@EnableAsync注解,开启了异步事件支持。同时,在定时方法上增加@Async注解,使任务能够异步执行,这样各个后台任务就不会阻塞。

    1. 启动项目

      创建好SchedulerTask定时任务后启动项目,查看后台任务的运行情况,如图22-2所示。

      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "org.sea.example.day14.task2")
      public class SpringbootDay14Application {public static void main(String[] args) {SpringApplication.run(SpringbootDay14Application.class, args);}}

      在这里插入图片描述

      ​ 图22-2 后台定时任务执行日志

      通过后台日志可以看到,Spring Boot启动线程池负责调度执行后台任务,各个后台任务之间相对独立、互不影响。

Quartz

1、什么是Quartz?

Quartz是OpenSymphony开源组织在任务调度(Job Scheduling,也称为作业调度)领域下的开源项目,它是Java开发的开源任务调度管理系统,具有使用灵活、配置简单的特点,能够实现复杂应用场景下的任务调度管理。当定时任务愈加复杂时,使用Spring Boot注解@Scheduled已经不能满足业务需要。相比之下,Quartz灵活而又不失简单,能够创建简单或复杂的调度任务,其主要具有如下功能:

1)持久化:将任务和状态持久化到数据库。

2)任务管理:对调度任务进行有效的管理。

3)集群:借助关系数据库和JDBC任务存储支持集群。

2、 Quartz的基本概念

Quartz是一个由Java开发的开源框架,用于执行定时任务。以下是Quartz的一些基本概念:

  1. Job:Job是一个接口,代表一个具体的任务。任务的具体逻辑在execute方法中实现。每次执行Job时,Quartz都会重新创建一个Job实例。
  2. JobDetail:用于定义Job的实例。因为相同的任务逻辑可能会被多次执行,所以使用JobDetail来创建每个独立的Job实例,确保各个任务可以独立运行。
  3. Trigger:Trigger是一个接口,用于定义执行给定Job的时间规则。主要有SimpleTrigger和CronTrigger这两个子接口。
  4. Scheduler:Scheduler是一个接口,代表Quartz的独立运行容器,用于与调度程序交互。
  5. JobBuilder:用于定义或构建JobDetail实例,帮助创建Job的实例。
  6. TriggerBuilder:用于定义或构建Trigger实例。

Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组和名称,组和名称是Scheduler查找、定位容器中某个对象的依据,Trigger的组和名称必须唯一,JobDetail的组和名称也必须唯一(但可以与Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组和名称访问控制容器中的Trigger与JobDetail。

总而言之,Scheduler相当于一个容器,其中包含各种Job和Trigger,四者之间的关系如图22-3所示

在这里插入图片描述

​ 图22-3 四者之间的关系图

Quartz通过Scheduler触发Trigger规则实现任务的管理和调度。除此之外,Quartz还提供了TriggerBuilderJobBuilder类来构建Trigger实例和Job实例。

Quartz主要有简单定时调度器(SimpleSchedule)和Cron表达式调度器(CronSchedule)来调度触发的定时任务。下面通过示例演示这两种调度器的用法。

简单定时调度器(SimpleSchedule
  1. 添加Quartz依赖

    在pom.xml中配置Quartz的依赖包spring-boot-starter-quartz,具体配置如下:

    		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
    
  2. 创建任务

    创建定时任务的实现类SimpleJob,并继承QuartzJobBean,示例代码如下:

    import lombok.extern.slf4j.Slf4j;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;@Slf4j
    public class SimpleJob extends QuartzJobBean {private String name;public void setName(String name) {this.name = name;}@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {log.info(String.format("Hello %s!", this.name));}
    }
    
  3. 构建JobDetail、CronTrigger

    接下来构建JobDetail和Trigger实例。首先使用SimpleScheduleBuilder创建Scheduler实例,然后关联JobDetail和Trigger实例。示例代码如下:

    import org.quartz.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class SimpleScheduler {@Beanpublic JobDetail simpleJobDetail() {return JobBuilder.newJob(SimpleJob.class).withIdentity("simpleJobDetail").usingJobData("name", "test simpleJob").storeDurably().build();}@Beanpublic Trigger sampleJobTrigger() {SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever();return TriggerBuilder.newTrigger().forJob(simpleJobDetail()).withIdentity("sampleJobTrigger").withSchedule(scheduleBuilder).build();}
    }
    
  4. 运行任务

    启动项目,验证任务是否能正常运行。如图22-4所示,

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    /**修改scanBasePackages */
    @SpringBootApplication(scanBasePackages = "org.sea.example.day14.job")
    public class SpringbootDay14Application {public static void main(String[] args) {SpringApplication.run(SpringbootDay14Application.class, args);}}
    

    在这里插入图片描述

    ​ 图22-4 简单任务运行日志

    SimpleJob后台任务成功运行,每隔10秒执行一次,这说明使用SimpleSchedule创建简单的定时任务运行成功。

Cron表达式调度器(CronSchedule
  1. 定义Job

    import lombok.extern.slf4j.Slf4j;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;@Slf4j
    public class CronJob extends QuartzJobBean {private String name;public void setName(String name) {this.name = name;}@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {log.info(String.format("Hello %s!", this.name));}
    }
    
  2. 构建JobDetail、CronTrigger

    import org.quartz.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class CronScheduler {@Beanpublic JobDetail cronJobDetail() {return JobBuilder.newJob(CronJob.class).withIdentity("cronJobDetail").usingJobData("name", "test cronJob").storeDurably().build();}@Beanpublic Trigger cronJobTrigger() {CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");return TriggerBuilder.newTrigger().forJob(cronJobDetail()).withIdentity("cronJobTrigger").withSchedule(scheduleBuilder).build();}
    }
    
  3. 运行任务

    启动项目,验证任务是否能正常运行。如图22-5所示,

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    /**修改scanBasePackages */
    @SpringBootApplication(scanBasePackages = "org.sea.example.day14.job2")
    public class SpringbootDay14Application {public static void main(String[] args) {SpringApplication.run(SpringbootDay14Application.class, args);}}
    

    在这里插入图片描述

    ​ 图22-5 Cron定时任务运行日志

    CronJob后台任务成功运行,每隔10秒执行一次,这说明使用CronScheduleBuilder创建简单的定时任务运行成功。

相关文章:

第二十二章 : Spring Boot 集成定时任务(一)

第二十二章 &#xff1a; Spring Boot 集成定时任务&#xff08;一&#xff09; 前言 本章知识点&#xff1a; 介绍使用Spring Boot内置的Scheduled注解来实现定时任务-单线程和多线程&#xff1b;以及介绍Quartz定时任务调度框架&#xff1a;简单定时调度器&#xff08;Simp…...

关于“Python”的核心知识点整理大全32

目录 12.6.4 调整飞船的速度 settings.py ship.py alien_invasion.py 12.6.5 限制飞船的活动范围 ship.py 12.6.6 重构 check_events() game_functions.py 12.7 简单回顾 12.7.1 alien_invasion.py 12.7.2 settings.py 12.7.3 game_functions.py 12.7.4 ship.py …...

【krita】实时绘画 入门到精通 海报+电商+装修+人物

安装插件 首先打开comfyUI&#xff0c;再打开krita&#xff0c;出现问题提示&#xff0c; 打开 cd custom_nodes 输入命令 安装控件 git clone https://github.com/Acly/comfyui-tooling-nodes.git krita基础设置 设置模型 设置lora &#xff08;可设置lora强度 增加更多…...

云原生系列2-CICD持续集成部署-GitLab和Jenkins

1、CICD持续集成部署 传统软件开发流程&#xff1a; 1、项目经理分配模块开发任务给开发人员&#xff08;项目经理-开发&#xff09; 2、每个模块单独开发完毕&#xff08;开发&#xff09;&#xff0c;单元测试&#xff08;测试&#xff09; 3、开发完毕后&#xff0c;集成部…...

50ms时延工业相机

华睿工业相机A3504CG000 参数配置&#xff1a; 相机端到端理论时延&#xff1a;80ms 厂家同步信息&#xff0c;此款设备帧率上线23fps&#xff0c;单帧时延&#xff1a;43.48ms&#xff0c;按照一图缓存加上传输显示的话&#xff0c;厂家预估时延在&#xff1a;80ms 厂家还有…...

CPU缓存一致性问题

什么是可见性问题&#xff1f; Further Reading &#xff1a;什么是可见性问题&#xff1f; 缓存一致性 内存一致性 内存可见性 顺序一致性区别 CPU缓存一致性问题 由于CPU缓存的出现&#xff0c;很好地解决了处理器与内存速度之间的矛盾&#xff0c;极大地提高了CPU的吞吐能…...

35道HTML高频题整理(附答案背诵版)

1、简述 HTML5 新特性 &#xff1f; HTML5 是 HTML 的最新版本&#xff0c;它引入了很多新的特性和元素&#xff0c;以提供更丰富的网页内容和更好的用户体验。以下是一些主要的新特性&#xff1a; 语义元素&#xff1a;HTML5 引入了新的语义元素&#xff0c;像 <article&g…...

【powershell】Windows环境powershell 运维之历史文件压缩清理

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…...

【Linux】Linux线程概念和线程控制

文章目录 一、Linux线程概念1.什么是线程2.线程的优缺点3.线程异常4.线程用途5.Linux进程VS线程 二、线程控制1.线程创建2.线程终止3.线程等待4.线程分离 一、Linux线程概念 1.什么是线程 线程是进程内的一个执行流。 我们知道&#xff0c;一个进程会有对应的PCB&#xff0c;…...

Flink cdc3.0同步实例(动态变更表结构、分库分表同步)

文章目录 前言准备flink环境docker构建mysql、doris环境数据准备 通过 FlinkCDC cli 提交任务整库同步同步变更路由变更路由表结构不一致无法同步 结尾 前言 最近Flink CDC 3.0发布&#xff0c; 不仅提供基础的数据同步能力。schema 变更自动同步、整库同步、分库分表等增强功…...

国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…...

肺癌相关知识

写在前面 大概想了解下肺癌相关的知识&#xff0c;开此贴做记录&#xff0c;看看后续有没有相关的生信文章思路。 综述 文章名期刊影响因子Lung cancer immunotherapy: progress, pitfalls, and promisesMol Cancer37.3 常见治疗手段有surgery, radiation therapy, chemoth…...

ChimeraX使用教程-安装及基本操作

ChimeraX使用教程-安装及基本操作 1、访问https://www.cgl.ucsf.edu/chimerax/download.html进行下载&#xff0c;然后安装 安装完成后&#xff0c;显示界面 2、基本操作 1、点击file&#xff0c;导入 .PDB 文件。 &#xff08;注&#xff1a;在 alphafold在线预测蛋白》点…...

【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数

上一课&#xff1a; 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念&#xff08;内核&任务&中断&#xff09;、与硬件的关系&实现 文章目录 一、任务设计1.1 任务概述1.2 任务的类型1.2.1 单次执行类任务&#xff08;运行至完成型&#…...

Redis一些常用的技术

文章目录 第1关&#xff1a;Redis 事务与锁机制第2关&#xff1a;流水线第3关&#xff1a;发布订阅第4关&#xff1a;超时命令第5关&#xff1a;使用Lua语言 第1关&#xff1a;Redis 事务与锁机制 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End补充代码&#xff0c;根据…...

基于QPainter 绘图图片绕绘制设备中心旋转

项目地址:https://gitcode.com/m0_45463480/QPainter/tree/main 获取途径:进入CSDN->GitCode直接下载或者通过git拉取仓库内容。 QPainter是Qt框架中的一个类,用于在QWidget或QPixmap等设备上进行绘图操作。它提供了丰富的绘图功能,可以用于绘制线条、图形、文本等。Q…...

计算机网络(4):网络层

网络层提供的两种服务 虚电路服务&#xff08;Virtual Circuit Service&#xff09;和数据报服务&#xff08;Datagram Service&#xff09;是在网络层&#xff08;第三层&#xff09;提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…...

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况&#xff1a; 3.4realloc有malloc的功能 五、常见的动…...

C语言---井字棋(三子棋)

Tic-Tac-Toe 1 游戏介绍和随机数1.1 游戏介绍1.2 随机数的生成1.3 棋盘大小和符号 2 设计游戏2.1 初始化棋盘2.2 打印棋盘2.3 玩家下棋2.4 电脑下棋2.5 判断输赢2.6 game()函数2.7 main()函数 3 完整三子棋代码3.1 Tic_Tac_Toe.h3.2 Tic_Tac_Toe.c3.3 Test.c 4 游戏代码的缺陷 …...

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…...

C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))

通过lambda表达式 std::iota()实现&#xff1a; template <typename Tp> inline void print_vec(const std::vector<Tp>& vec) {fmt::print("[{}]\n", fmt::join(vec, ", ")); }// 相当于Python的lst list(range(31, 90))const std::ve…...

【Java之数据结构与算法】

选择排序 package Code01;public class Code01_SelectionSort {public static void selectionSort(int[] arr) {if(arrnull||arr.length<2) {return;}for(int i0;i<arr.length;i) {int minIndex i;for(int ji1;j<arr.length;j) {minIndex arr[minIndex] > arr[j…...

爬虫scrapy中间件的使用

爬虫scrapy中间件的使用 学习目标&#xff1a; 应用 scrapy中使用间件使用随机UA的方法应用 scrapy中使用代理ip的的方法应用 scrapy与selenium配合使用 1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为&#xff1a; 下载中间件…...

普冉(PUYA)单片机开发笔记 [完结篇]:使用体会

失败的移植&#xff1a;FreeRTOS 当使用了 PY32F003 的各种接口和功能后&#xff0c;手痒痒想把 FreeRTOS 也搬到这个 MCU 上&#xff0c;参考 STM32 和 GD32 对 FreeRTOS 的移植步骤&#xff0c;把 FreeRTOS v202212.00 版本的源码搬到了 Keil 工程中&#xff0c;编译倒是通过…...

Elasticsearch:生成 AI 中的微调与 RAG

在自然语言处理 (NLP) 领域&#xff0c;出现了两种卓越的技术&#xff0c;每种技术都有其独特的功能&#xff1a;微调大型语言模型 (LLM) 和 RAG&#xff08;检索增强生成&#xff09;。 这些方法极大地影响了我们利用语言模型的方式&#xff0c;使它们更加通用和有效。 在本文…...

ip静态好还是dhcp好?

选择使用静态 IP 还是 DHCP&#xff08;动态主机配置协议&#xff09;取决于您的网络需求和环境。下面是它们的一些特点和适用场景&#xff1a; 静态 IP&#xff1a; 固定的 IP 地址&#xff1a;静态 IP 是手动配置在设备上的固定 IP 地址&#xff0c;不会随时间或网络变化而改…...

PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评

为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的&#xff0c;因此索引的写入需要与主键的写入放在一个事务当中&#xff0c;事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中&#xff0c;从使用体验的角度看…...

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差&#xff0c;不利于在不同规模的数据集上有效运行若输入维度发生变化&#xff0c;需要修改并重新训练网络容易过拟合 全连接导致参数量特别多&#xff0c;容易过拟合如果增加更多层&#xff0c;参数量会翻倍无法有效利用局部特征 输入…...

鸿蒙开发基本概念

1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…...

Open CV 图像处理基础:(二)从基本概念到实践操作

Open CV 图像处理基础&#xff1a;从基本概念到实践操作 一、引言 图像处理是计算机视觉领域的一个重要分支&#xff0c;它涉及对图像的各种操作和处理。了解图像的基本概念、读取和显示方法以及基本操作是图像处理的基础。本文将通过示例文章的形式&#xff0c;帮助初学者逐…...

涉密项目单位网站建设流程/手机网页制作软件

一、设置动态获取IP dhclient命令使用动态主机配置协议动态的配置网络接口的网络参数。 语法 dhclient(选项)(参数) 选项 0&#xff1a; 指定dhcp客户端监听的端口号&#xff1b; -d&#xff1a;总是以前台方式运行程序&#xff1b;-q&#xff1a;安静模式&#xff0c;不打印…...

广东网页制作网站/论坛如何做seo

裴波那切数在百度百科的定义是&#xff1a; 斐波那契数&#xff0c;亦称之为斐波那契数列&#xff08;意大利语&#xff1a; Successione di Fibonacci)&#xff0c;又称黄金分割数列、费波那西数列、费波拿契数、费氏数列&#xff0c;指的是这样一个数列&#xff1a;0、1、1、…...

公司网站建设工作重点/提高网站搜索排名

问题描述 今天在设计python串口代码时遇见一个问题&#xff0c;接收到的数据打印出来&#xff0c;一直都是两三组连在一起&#xff0c;即我的目标数据是&#xff1a; 7e307d02087d01557e 但是我把接收到的数据经过处理打印出来后是&#xff1a;7e307d02087d01557e7e307d02087d…...

新时期如何做好政府网站建设/天天自学网网址

小米的百科诠释太多了内容小米集团&#xff0c;我觉得也不用怎么介绍了&#xff0c;大家太熟悉了&#xff01;小米的产业链想必大家也知道我也不多说&#xff0c;直接看产品&#xff01;直接入正题吧。小米的airdots实际上从出身开始他是有着高级芯片的&#xff0c;csr8670&…...

做网站郑州汉狮/上海城市分站seo

Python3中有六种基本数据类型&#xff1a; Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dict(字典) 他们之前有什么区别?联系?直接上图&#xff1a;按照图示的分类,开始学习吧。(python3) Number(数字类型) Python3 支持 int、float、bool、complex(复数)…...

从网址怎么看网站的域名/品牌设计公司

这几天做了下美团校招的一些套题。(只写了编程&#xff0c;这两天慢慢更新吧)这套题还是蛮简单的。。我暴力了好几个都能过。一个小时多一点差不多能写完。4、棋子翻转题意&#xff1a;在4*4的棋盘上摆满了黑白棋子&#xff0c;黑白两色的位置和数目随机其中左上角坐标为(1,1),…...