异步任务与定时任务
一、异步任务
基于TaskExecutionAutoConfiguration配置类中,注册的ThreadPoolTaskExecutor线程池对象进行异步任务执行。
(一)手动执行异步任务
在yml中配置线程池参数
spring: task:execution:pool:core-size: 5 # 核心线程数max-size: 20 # 最大线程数queue-capacity: 1000 # 线程池使用的阻塞队列的最大容量scheduling:pool:size: 10 # 配置了调度任务的线程池:线程数为10 (: 10)
代码示例:
@Resource
private ThreadPoolTaskExecutor taskExecutor;@Override
public WebUser doUnameLogin(String username, String password) {// 根据用户名 密码 查询用户信息WebUser webUser = webUserService.getByUname(username);// 判断用户是否存在if (webUser == null) {throw new JavasmException(JavasmExceptionEnum.UserNotExist);}// 判断密码if (!password.equals(webUser.getPassword())) {throw new JavasmException(JavasmExceptionEnum.PasswordError);}/*new Thread(() -> { }).start();*/// 使用线程池异步执行,避免阻塞主线程,而不是使用new ThreadtaskExecutor.execute(()->{// 增加需求:每天,每个用户只记录一次登录信息SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");String date = simpleDateFormat.format(new Date());// 从redis中查询 当前用户,是否有登录记录String loginLogKey = String.format(RedisKeys.Login_Log_Key, date, webUser.getUid());Object o = redisTemplate.opsForValue().get(loginLogKey);if (o == null) { // 用户当天没有登录记录,存入redis和数据库中// 登录时,需要一起查询webUserInfo的内容// 记录登录信息WebUserLoginLog webUserLoginLog = new WebUserLoginLog();webUserLoginLog.setUid(webUser.getUid());webUserLoginLogService.save(webUserLoginLog);redisTemplate.opsForValue().set(loginLogKey, webUser.getUid(), 1, TimeUnit.DAYS);}});// 登录成功 返回用户信息return webUser;
}
@Override
@Transactional
public void doRegister(WebUser webUser) {// TODO:查询邮箱是否已经存在// 添加web_user表 web_user_info表webUserService.save(webUser);if (webUser != null && webUser.getWebUserInfo() != null) {webUser.getWebUserInfo().setUid(webUser.getUid());// 随机分配头像String baseUrl = "http://cd.ray-live.cn/imgs/headpic/pic_%s.jpg";// 随机数:ThreadLocalRandom.current线程安全,顾前不顾后int index = ThreadLocalRandom.current().nextInt(0, 70);webUser.getWebUserInfo().setHeadPic(String.format(baseUrl, index));webUserInfoService.save(webUser.getWebUserInfo());}WebUser newWebUser = webUser.clone();// 这里使用克隆的原因:上面没有给webUserInfo赋值。下面的代码会用到webUserInfo,我们不需要webUserInfo中有值// 先执行上面的代码,然后才会执行下面的代码,不存在线程调用异常的问题// 存入redis// 由于往Redis中添加数据,不属于注册主流程,要放到子线程中/*new Thread(() -> {}).start();*/// 使用线程池异步执行,避免阻塞主线程taskExecutor.execute(()->{// 配置的是数据库添加的默认值,此时的 webUser.getUserInfo() 是没有其他默认属性的// 想获取全部的数据,存入Redis,需要重新查询Integer uid = newWebUser.getUid();WebUserInfo userInfo = webUserInfoService.getById(uid);newWebUser.setWebUserInfo(userInfo);String unamekey = String.format(RedisKeys.User_Uname, newWebUser.getUsername());// 因为RedisTemplate<String, Object> ,所以可以传入webUserredisTemplate.opsForValue().set(unamekey, newWebUser);String uidKey = String.format(RedisKeys.User_Uid, newWebUser.getUid());redisTemplate.opsForValue().set(uidKey, newWebUser);});
}
(二)基于异步注解
启动异步注解识别
@Configuration
@MapperScan("com.javaplay.playPal.*.dao")
@EnableAsync // 开启异步注解
public class ServerConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
在需要异步执行的方法添加@Async注解
@Async
public void test(String str){log.info(str);
}
不建议直接在本类中使用,因为异步代码散乱到项目各个类中,不易后期维护,且必须跨类才支持异步注解使用。
二、定时任务
定时任务是基于TaskSchedulingAutoConfiguration配置类中,注册的ThreadPoolTaskScheduler任务调度线程池对象。不论是基于注解还是基于SchedulingConfigurer进行定时任务实现,都需要首先在配置类中启用定时任务。
(一)启动定时任务
@Configuration
@MapperScan("com.javaplay.playPal.*.dao")
@EnableAsync // 开启异步注解
@EnableScheduling // 开启定时任务注解
public class ServerConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
是否需要同时使用异步和定时?
- 如果定时任务不需要异步执行,仅需使用@EnableScheduling和@Scheduled注解即可满足需求。
- 如果希望定时任务能够异步执行,避免阻塞主线程(例如,避免一个定时任务的执行阻塞另一个定时任务),那么除了@EnableScheduling外,还需要添加@EnableAsync。这样,可以将@Async注解应用到定时任务的方法上,使其异步执行。
(二)固定的定时任务
在编码阶段,已经固定了定时的逻辑,不能在不停止服务器的情况下更改逻辑。
例如,每天凌晨1点执行某个查询任务,如果想要改为每天凌晨2点,就必须停止服务器,更改定时任务规则,再重新启动服务器。
@Component
@Slf4j
public class TestTask {// 希望多久/什么频率, 执行一次/多次 当前的方法// 从第0秒开始,每隔5秒执行1次// cron="秒 分 小时 日期 月份 星期 年"// 星期和日期互斥,不能同时设置,必须有1个是? 年是可以省略的@Scheduled(cron = "0/5 * * * * ?")@Asyncpublic void f1() {log.info("---------------测试f1 ------每隔5秒执行1次");}// 从第10秒开始,每秒执行1次,第20秒的时候终止@Scheduled(cron = "10-20 * * * * ?")@Async // 可选,是否加异步,可自定义public void f2() {log.info("===========f2--从第10秒开始,每秒执行1次,第20秒的时候终止");}
}
#经典案例:
“30 * * * * ?” 每分钟第30秒触发任务
“30 10 * * * ?” 每小时的10分30秒触发任务
“30 10 1 * * ?” 每天1点10分30秒触发任务
“30 10 1 20 * ?” 每月20号1点10分30秒触发任务
“30 10 1 20 10 ? *” 每年10月20号1点10分30秒触发任务
“30 10 1 20 10 ? 2011” 2011年10月20号1点10分30秒触发任务
“30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
“30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务
“15,30,45 * * * * ?” 每分钟的第15秒,30秒,45秒时触发任务
“15-45 * * * * ?” 15到45秒内,每秒都触发任务
“15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
“15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
“0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
“0 15 10 ? * MON-FRI” 星期一到星期五的10点15分0秒触发任务
“0 15 10 L * ?” 每个月最后一天的10点15分0秒触发任务
“0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务
“0 15 10 ? * 5L” 每个月最后一个星期四的10点15分0秒触发任务
“0 15 10 ? * 5#3”每个月第三周的星期四的10点15分0秒触发任务
@Resource
NewsService newsService;// 同步新闻列表
@Scheduled(cron = "0 0 0/1 * * ?")
@Async
public void f3() {log.info("每天00:00:00开始同步新闻列表,每隔1小时执行1次");newsService.syncNews();
}
(三)可变的定时任务
package com.javaplay.playPal.task.runnable;import lombok.extern.slf4j.Slf4j;@Slf4j
@Component
public class TestTask implements Runnable {@Overridepublic void run() {log.info("定时任务,执行了");}
}
@Component
@Slf4j
public class NewsTask implements Runnable{@ResourceNewsService newsService;@Overridepublic void run() {log.info("开始同步新闻");newsService.syncNews();}
}
create table sys_task
(id int auto_increment primary key,name varchar(255) null comment '任务名称',clazz varchar(255) null comment '执行任务的类',cron varchar(255) null comment '定时任务表达式',status int default 0 null comment '状态 0关闭 1开启',ctime datetime null comment '创建时间'
);INSERT INTO testdb.sys_task (id, name, clazz, cron, status, ctime)
VALUES (1, '测试定时任务', 'com.javaplay.playPal.task.runnable.TestTask', '0/5 * * * * ?', 0, '2025-01-17 19:50:48');
INSERT INTO testdb.sys_task (id, name, clazz, cron, status, ctime)
VALUES (2, '新闻同步', 'com.javaplay.playPal.task.runnable.NewsTask', '0/10 * * * * ?', 0, '2025-01-17 20:39:14');
@Component
@Slf4j
public class JavaTestSchedulingConfigurer implements SchedulingConfigurer {private ScheduledTaskRegistrar scheduledTaskRegistrar;private Map<Integer, ScheduledTask> map = new ConcurrentHashMap<>();@ResourceApplicationContext applicationContext;@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {// 项目启动的时候,就已经调用了这个方法,并且是在启动成功之前调用的// 考虑到有可能有多个定时任务,所以,要创建一个线程池,专门用来存放定时任务// 创建一个包含10个线程的调度线程池executorService。ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);// 使用该线程池创建一个ConcurrentTaskExecutor对象taskExecutor,用于执行定时任务。ConcurrentTaskScheduler taskScheduler = new ConcurrentTaskScheduler(executorService);// 开启注册 定时任务对象scheduledTaskRegistrar.setScheduler(taskScheduler);// 放到全局变量,这样其他方法,就可以调用/使用 参数了this.scheduledTaskRegistrar = scheduledTaskRegistrar;}public boolean regTask(SysTask task) {if (task == null) {return false;}// 任务idInteger id = task.getId();// 执行任务的类String clazz = task.getClazz();// 表达式String cron = task.getCron();// new对象try {Class<?> aClass = Class.forName(clazz);// Object o = aClass.getConstructor().newInstance();Object o = applicationContext.getBean(aClass);Runnable runnable = (Runnable) o;// 执行任务对象CronTask cronTask = new CronTask(runnable, cron);// 任务开始ScheduledTask scheduledTask = this.scheduledTaskRegistrar.scheduleCronTask(cronTask);// 将已经开始的任务对象存入全局,等待停止map.put(id, scheduledTask);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}return true;}public void stop(Integer id) {ScheduledTask scheduledTask = map.get(id);if (scheduledTask != null) {// 停止定时任务scheduledTask.cancel();map.remove(id);}}
}
@RestController
@RequestMapping("/task")
public class SysTaskController {/*** 服务对象*/@Resourceprivate SysTaskService sysTaskService;@GetMapping("/start/{id}")public R start(@PathVariable Integer id) {sysTaskService.startTask(id);return R.ok();}@GetMapping("/stop/{id}")public R stop(@PathVariable Integer id) {sysTaskService.stopTask(id);return R.ok();}
}
@Service("sysTaskService")
public class SysTaskServiceImpl extends ServiceImpl<SysTaskDao, SysTask> implements SysTaskService {@Resourceprivate JavaTestSchedulingConfigurer javaTestSchedulingConfigurer;@Resourceprivate ThreadPoolTaskExecutor taskExecutor;@Overridepublic void startTask(Integer id) {// 查询任务信息SysTask sysTask = getById(id);// 如果任务注册成功if (javaTestSchedulingConfigurer.regTask(sysTask)) {taskExecutor.execute(() -> {// 修改任务状态sysTask.setStatus(1);updateById(sysTask);});}}@Overridepublic void stopTask(Integer id) {javaTestSchedulingConfigurer.stop(id);// 主要业务的代码,不能放到多线程中// 主要业务执行之后的次要业务,比如说修改状态,添加一些附表的值/修改缓存等,可以放入子线程,用来提高效率taskExecutor.execute(()->{SysTask sysTask = new SysTask();sysTask.setId(id);sysTask.setStatus(0);updateById(sysTask);});}
}
调用/task/start/{id}和/task/stop/{id}接口,就可以操作定时任务启停了。
相关文章:
异步任务与定时任务
一、异步任务 基于TaskExecutionAutoConfiguration配置类中,注册的ThreadPoolTaskExecutor线程池对象进行异步任务执行。 (一)手动执行异步任务 在yml中配置线程池参数 spring: task:execution:pool:core-size: 5 # 核心线程数max-size: 20 # 最大线…...
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5)
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.5 Chatbot的特殊Events11.5.1 各事件总演示11.5.2 详解.undo、.retry、.like和.edit…...
32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)
困难不会永远存在,只要你勇于面对,坚持努力,就一定能够战胜一切困难。每一次挑战都是一次成长的机会,不要害怕失败,失败是成功之母。只有经历过失败,你才能更加明白自己的不足,并不断改进自己&a…...
扣除价格因素与剔除季节性因素:统计数据中的“真实”增长(中英双语)
扣除价格因素与剔除季节性因素:统计数据中的“真实”增长 在经济统计分析中,我们经常会听到“扣除价格因素”和“剔除季节性因素”这两个概念。这两者都是为了排除外部干扰因素,真实反映经济活动的增长情况。它们分别针对价格波动和季节性波…...
网卡接收报文的过程
网卡接收报文的过程通常包括以下几个关键步骤: 1. 硬件接收: • 网卡硬件首先接收到从网络传输过来的数据包。网络接口卡(NIC)负责将接收到的电信号转换为数字信号,并存储到一个硬件缓冲区中。 2. DMA传输ÿ…...
Windows图形界面(GUI)-QT-C/C++ - QT 对话窗口
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 模态对话框 非模态对话框 文件对话框 基本概念 静态函数 常见属性 颜色对话框 基本概念 静态函数 常见属性 字体对话框 基本概念 静态函数 常见属性 输入对话框 基本概念 …...
bypass--2025春秋杯冬季赛
漏洞点 题目不难,这个循环赋值的结束条件是s[i]0,并且s和key再栈上的位置是挨着的 那么很容易想到,第二次循环赋值的时候,有一个溢出,溢出部分的值是第一次写入的key的值。 那么基本思路就是,利用这段溢出…...
学习微信小程序的下拉列表控件-picker
1、创建一个空白工程 2、index.wxml中写上picker布局: <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…...
【17】Word:林楚楠-供应链❗
目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为:文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式:形状轮廓…...
父子盒子滑动事件穿透问题
问题描述 当父子盒子都有滚动条时,在子盒子内滚动时,父盒子滚动子盒子无法滚动,直到父盒子滚动到底部,子盒子才滚动 解决 如果是vue的项目,直接在子盒子上添加 wheel.stop""...
vue-amap、leaflet、融汇 离线地图瓦片使用情况分析
vue-amap: vue3写的,使用文档 -> 文档地址 <-的离线jsApi里的demo,发现 tile-url不能读取本地项目文件夹里的瓦片,文档里写的其实还是要互联网读取的高德瓦片......... 作者在git库回复tile-url要么放项目里使用绝对路…...
leetcode - 1055. Shortest Way to Form String
Description A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., “ace” is a subsequence of “abcd…...
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发三
目录 1 -> 绘制图形 1.1 -> 绘制基本几何图形 1.2 -> 绘制自定义几何图形 2 -> 添加动画效果 2.1 -> animateTo实现闪屏动画 2.2 -> 页面转场动画 3 -> 常见组件说明 1 -> 绘制图形 绘制能力主要是通过框架提供的绘制组件来支撑,支…...
RabbitMQ 进阶
文章目录 一、发送者的可靠性 1.1 生产者重试机制:1.2 生产者确认机制: 1.2.1 开启生产者确认:1.2.2 定义 ReturnCallback:1.2.3 定义 ConfirmCallback: 二、MQ 的可靠性 2.1 数据持久化: 2.1.1 交换机持…...
RabbitMQ---TTL与死信
(一)TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL,当消息到达过期时间还没有被消费时就会自动删除 注:这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身,不是说队列过期时间…...
uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)
1. 小程序、app 在uniapp开发小程序环境或者app环境中,都可以使用以下方式预览文件 之前其实写过一篇,就是使用uniapp官网提供文件下载、文件保存、文件打开的API, uniapp文件下载 感兴趣也可以去看下 uni.downloadFile({// baseURL 是...
Spring Boot经典面试题及答案
一、Spring Boot基础知识 什么是Spring Boot? 答案: Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案。它简化了Spring应用程序的初始化和开发过程,通过“约定大于配置”的原则,减少了手动配置的繁…...
usb通过hdc连接鸿蒙next的常用指令
参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…...
FPGA:Quartus软件与操作系统版本对照表
文章目录 1.软件概述2.软件版本3.设计流程4.支持的设备5.新特性6.版本对照 1.软件概述 Quartus软件是由英特尔(Intel)公司开发的一款功能强大的FPGA(现场可编程逻辑门阵列)设计工具,广泛应用于数字电路设计、仿真、综…...
RustDesk ID更新脚本
RustDesk ID更新脚本 此PowerShell脚本自动更新RustDesk ID和密码,并将信息安全地存储在Bitwarden中。 特点 使用以下选项更新RustDesk ID: 使用系统主机名生成一个随机的9位数输入自定义值 为RustDesk生成新的随机密码将RustDesk ID和密码安全地存储…...
[C语言]字符串分离
题目 从标准输入流(控制台)中获取一行字符串 str,字符串中可能会存在空格,现在需要将字符串进行分离,规则如下: (1)将 str 中位于 偶数下标 的元素放置在字符串 str1 之中 (2)将 str 中位于 奇数下标 的…...
-bash: /java: cannot execute binary file
在linux安装jdk报错 -bash: /java: cannot execute binary file 原因是jdk安装包和linux的不一致 程序员的面试宝典,一个免费的刷题平台...
Python绘制数据地图-GeoPandas入门
使用GeoPandas绘制数据地图是一种非常直观且强大的数据可视化方法。GeoPandas是一个Python库,专门用于处理地理空间数据,它建立在Pandas和Shapely库之上,并集成了matplotlib、seaborn等绘图库的功能。 下面是一个简单的入门教程,…...
CVPR 2024 图像处理方向总汇(图像去噪、图像增强、图像分割和图像恢复等)
1、Image Progress(图像处理) 去鬼影 Generating Content for HDR Deghosting from Frequency View去阴影 HomoFormer: Homogenized Transformer for Image Shadow Removal去模糊 Unsupervised Blind Image Deblurring Based on Self-EnhancementLatency Correction for E…...
c++ string
1 sting 基本概念 string 基本概念 本质:string是c风格的字符串,而string 本质上是一个类string 和char* 的区别: char * 是一个指针 string 是一个类,类内部封装了char*,管理这个字符串,是一个char* 数组…...
tomcat文件目录讲解
目录的用处 bin:tomcat的可执行命令,比如:tomcat的启动停止命令,也包含其他命令以及.bat(Windows执行的命令)和.sh(Linux操作系统执行的命令)文件config:关于tomcat的配置࿰…...
博客搭建 — GitHub Pages 部署
关于 GitHub Pages GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,通过构建过程运行文件,然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…...
【0x0052】HCI_Write_Extended_Inquiry_Response命令详解
目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Extended_Inquiry_Response命令格式 2.2. FEC_Required 2.3. Extended_Inquiry_Response 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令准备阶段(主机端) 4.2…...
Kotlin Bytedeco OpenCV 图像图像55 图像透视变换
Kotlin Bytedeco OpenCV 图像图像53 图像透视变换 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apa…...
flutter Get GetMiddleware 中间件不起作用问题
当使用 get: ^5.0.0-release-candidate-9.2.1最新版本时,中间件GetMiddleware各种教程都是让我们在redirect中实现,比如: overrideRouteSettings? redirect(String? route) {return RouteSettings(name: "/companyAuthIndexPage"…...
npm介绍
npm(Node Package Manager)是 Node.js 的默认包管理工具,用于管理 JavaScript 和 Node.js 项目的依赖关系。它既是一个包管理工具,又是一个在线仓库,开发者可以通过它分享和下载开源的 JavaScript 库和工具。npm 是世界…...
Ruby语言的数据结构
Ruby语言的数据结构详解 Ruby是一种动态、面向对象的编程语言,因其简洁优雅的语法而受到开发者的喜爱。在Ruby中,数据结构是构建和管理数据的一种方式,不同的数据结构适用于不同的场景。本文将详细探讨Ruby中的几种主要数据结构,…...
web开发工具之:一、UUID的介绍,java如何产生UUID,作为数据库的主键和加密算法的盐
文章目录 前言一、UUID是什么二、java如何产生UUID1. 生成随机 UUID(Version 4)2. 通过指定的字符串生成 UUID 三、UUID作为数据库主键1. 优点2. 缺点 四、UUID作为加密的盐总结 前言 现在web开发中,很多使用UUID作为主键和加密的盐的&#…...
精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】
Focaler-IoU: 更聚焦的交并比损失 Focaler-IoU: More Focused Intersection over Union Loss Focaler-IoU: 更聚焦的交并比损失I. 引言II. 相关工作III. 方法IV. 实验V. 结论 原文地址:官方论文地址 代码地址:官方代码地址 摘要——边界框回归在目标检…...
Android-目前最稳定和高效的UI适配方案
谈到适配,首先需要介绍几个基本单位: 1、密度无关像素(dp): 含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关 单位:dp,可以保证在…...
Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)
文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…...
docker安装Nginx UI
开源地址:nginx-ui/README-zh_CN.md at dev 0xJacky/nginx-ui GitHub docker run -dit \ --namenginx-ui \ --restartalways \ -e TZAsia/Shanghai \ -v /Users/xiaoping/docker/appdata/nginx:/etc/nginx \ -v /Users/xiaoping/docker/appdata/nginx-ui:/etc/ng…...
【AI】【RAG】使用WebUI部署RAG:数据优化与设置技巧详解
RAG(Retrieval-Augmented Generation)是一种通过知识库构建的高效问答系统。然而,在使用WebUI部署和优化RAG时,数据源管理和参数设置直接决定了系统的回答质量。本文将结合具体问题和优化方法,为您详细解读如何最大化RAG的性能和准确性。 数据源相关问题及解决方案 在实际…...
如何在vue中渲染markdown内容?
文章目录 引言什么是 markdown-it?安装 markdown-it基本用法样式失效?解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中,Markdown 作为一种轻量级的标记语言,广泛用于文档编写、内容管理以及富文本编辑器中。markdown…...
nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)
一、安装nvm 1. 下载nvm nvm-windows官网地址https://github.com/coreybutler/nvm-windows/releases 如果打不开也可以到这里下载 2.双击 nvm-setup.exe 开始安装 3.选择nvm安装路径,路径名称不要有空格,然后点击next 4.node.js安装…...
机器学习-归一化
文章目录 一. 归一化二. 归一化的常见方法1. 最小-最大归一化 (Min-Max Normalization)2. Z-Score 归一化(标准化)3. MaxAbs 归一化 三. 归一化的选择四. 为什么要进行归一化1. 消除量纲差异2. 提高模型训练速度3. 增强模型的稳定性4. 保证正则化项的有效…...
一次完整的tcpdump -XX输出报文详解
报文: 03:32:51.745623 IP (tos 0x0, ttl 64, id 65006, offset 0, flags [DF], proto TCP (6), length 94) 10.229.43.200.6471 > 10.229.43.200.55674: Flags [P.], cksum 0x6daa (incorrect -> 0x2e06), seq 1:43, ack 42, win 3635, options [nop,nop…...
【STM32-学习笔记-9-】SPI通信
文章目录 SPI通信Ⅰ、SPI通信概述1、SPI技术规格2、SPI应用 3、硬件电路移位示意图 Ⅱ、SPI时序基本单元①、起始条件②、终止条件③、交换一个字节(模式0)④、交换一个字节(模式1)⑤、交换一个字节(模式2)…...
kalilinux - 目录扫描之dirsearch
情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站,例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考,我们只指导https://www.example.com/ 但不知道它下面有什么文件,文…...
(12)springMVC文件的上传
SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件(记得添加乱码过滤)配置springmvc-servlet文件&…...
[Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图
目录 1. MAC安装环境 1. 1 Icarus Verilog 编译 1. 2 gtkwave 查看波形 2. 安装遇到的问题 2. 1 macOS cannot verify that this app is free from malware 2. 2 gtkwave-bin is not compatible with macOS 14 or later 3. 运行示例 3. 1 源代码 3. 2 编译Verilog 3. 3 生成.v…...
yt-dlp脚本下载音频可选设置代理
import yt_dlp# 配置:是否使用代理 use_proxy = True # 设置为 False 可关闭代理# 代理地址 proxy_url = socks5://127.0.0.1:1089URLS = [https://www.bilibili.com/video/BV1WTktYcEcQ/?spm_id_from=333.1007.tianma.6-2-20.click&vd_source=dcb58f8fe1faf749f438620b…...
【向量数据库 Milvus】linux 源码安装 Milvus 2.5.3
在 Linux 系统(如 ai 5.10.134-16.2.an8.x86_64)上通过源码安装 Milvus 2.5.3 的步骤如下。该指南适用于 x86_64 架构的系统。 1. 环境准备 确保系统满足以下要求: 操作系统: Linux(x86_64 架构)Go: 1.21 或更高版本…...
初学stm32 --- CAN
目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…...
linux手动安装mysql5.7
一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包: https://downloads.mysql.com/archives/community/ 2、在线下载,使用wget命令,直接从官网下载到linux服务器上 wget https://downloads.mysql.co…...