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

timerfd定时器时间轮定时器

目录

一、timerfd定时器

二、timerfd定时器代码演示

三、时间轮定时器


一、timerfd定时器

timerfd是一种通过文件描述符管理定时器的机制

#include <sys/timerfd.h>

int timerfd_create(int clockid, int flags);

作用:创建定时器的文件描述符

返回值:创建成功返回定时器的文件描述符,失败返回-1并设置错误码

int clockid:指定定时器使用的时间。CLOCK_REALTIME使用系统实时时间,修改系统时间会影响定时器;CLOCK_MONOTONIC使用单调时间,即从系统启动的时间开始计算

int flags:设置文件描述符模式。TFD_NONBLOCK是非阻塞模式,读取后立即返回;TFD_CLOEXEC,执行exec进行进程替换时,关闭该定时器文件描述符


int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);

作用:设置定时器的触发时间(每当定时器触发时,都会向定时器文件描述符中写入距离上一次读取已经触发的次数,如果一直没有读取定时器文件描述符中的数据,次数会一直累加)

返回值:成功返回0,失败返回-1并设置错误码

int fd:定时器文件描述符

int flags:指定定时器的计时方式。0表示使用相对时间,即相对于当前时间的偏移;TFD_TIMER_ABSTIME表示使用绝对时间,即一个具体的时间点

const struct itimerspec *new_value:新的定时器时间参数

struct itimerspec *old_value:旧的定时器时间参数(保存一下,需要可以恢复旧参数)

struct itimerspec结构体:

struct itimerspec {struct timespec it_interval; // 第一次超时后,每隔xxx时间读取数据struct timespec it_value;    // 第一次等待的时间
};
struct timespec {time_t tv_sec;  // 秒long   tv_nsec; // 纳秒 [0, 999999999]
};

二、timerfd定时器代码演示

定时器文件描述符为阻塞模式,定时器触发后立即读取,共循环10次

#include <iostream>
#include <sys/timerfd.h>
#include <unistd.h>//提供read函数void test()
{//创建timerfd定时器int timerfd=timerfd_create(CLOCK_REALTIME,0);if(timerfd<0){perror("Timerfd create fail!\n");return;}//设置定时器的触发时间struct itimerspec its={{3,0},{5,0}};//首次5秒触发,后续间隔3秒触发int n=timerfd_settime(timerfd,0,&its,nullptr);if(n<0){perror("Timerfd settime fail!\n");return;}//读取定时器文件描述符的数据uint64_t timeout;int count=10;while(count-->0){ssize_t m=read(timerfd,&timeout,sizeof(timeout));if(m>0){std::cout<<"距离上一次读取数据,已经触发"<<timeout<<"次"<<std::endl;}else{if(errno==EAGAIN){continue;}else{perror("Read fail\n");break;}}}//关闭定时器文件描述符close(timerfd);
}int main()
{test();return 0;
}

三、时间轮定时器

时间轮定时器思想:

时间轮的思想来源于钟表,如果我们定了⼀个3点钟的闹铃,则当时针⾛到3的时候,就代表时间到了。
同样的道理,如果我们定义了⼀个数组,并且有⼀个指针,指向数组起始位置,这个指针每秒钟向后⾛动⼀步,⾛到哪⾥,则代表哪⾥的任务该被执⾏了,那么如果我们想要定⼀个3s后的任务,则只需要将任务添加到tick+3位置,则每秒中⾛⼀步,三秒钟后tick⾛到对应位置,这时候执⾏对应位置的任务即可。
但是,同⼀时间可能会有⼤批量的定时任务,因此我们可以给数组对应位置下拉⼀个数组,这样就可以在同⼀个时刻上添加多个定时任务了。
当然,上述操作也有⼀些缺陷,⽐如我们如果要定义⼀个60s后的任务,则需要将数组的元素个数设置为60才可以,如果设置⼀⼩时后的定时任务,则需要定义3600个元素的数组,这样⽆疑是⽐较⿇烦的。
因此,可以采⽤多层级的时间轮,有秒针轮,分针轮,时针轮, 60<time<3600则time/60就是分针轮对应存储的位置,当tick/3600等于对应位置的时候,将其位置的任务向分针,秒针轮进⾏移动。 
因为当前我们的应⽤中,倒是不⽤设计的这么⿇烦,因为我们的定时任务通常设置的30s以内,所以简单的单层时间轮就够⽤了。但是,我们也得考虑⼀个问题,当前的设计是时间到了,则主动去执⾏定时任务,释放连接,那能不能在时间到了后,⾃动执⾏定时任务呢,这时候我们就想到⼀个操作-类的析构函数。 
⼀个类的析构函数,在对象被释放时会⾃动被执⾏,那么我们如果将⼀个定时任务作为⼀个类的析构函数内的操作,则这个定时任务在对象被释放的时候就会执⾏。但是仅仅为了这个⽬的,⽽设计⼀个额外的任务类,好像有些不划算,但是,这⾥我们⼜要考虑另⼀个问题,那就是假如有⼀个连接建⽴成功了,我们给这个连接设置了⼀个30s后的定时销毁任务,但是在第10s的时候,这个连接进⾏了⼀次通信,那么我们应该时在第30s的时候关闭,还是第40s的时候关闭呢?⽆疑应该是第40s的时候。也就是说,这时候,我们需要让这个第30s的任务失效,但是我们该如何实现这个操作呢?
这⾥,我们就⽤到了智能指针shared_ptr,shared_ptr有个计数器,当计数为0的时候,才会真正释放⼀个对象,那么如果连接在第10s进⾏了⼀次通信,则我们继续向定时任务中,添加⼀个30s后(也就是第40s)的任务类对象的shared_ptr,则这时候两个任务shared_ptr计数为2,则第30s的定时任务被释放的时候,计数-1,变为1,并不为0,则并不会执⾏实际的析构函数,那么就相当于这个第30s的任务失效了,只有在第40s的时候,这个任务才会被真正释放。

//时间轮定时器模块#include <iostream>
#include <sys/timerfd.h>
#include <functional>
#include <vector>
#include <unordered_map>
#include <memory>
#include <unistd.h>using TaskFunc=std::function<void()>;
using ReleaseFunc=std::function<void()>;//定时任务:时间到了定时任务就要被触发,执行
class TimerTask
{
private:TaskFunc _task;//定时任务,析构时执行uint64_t _id;//任务序号uint32_t _timeout;//定时任务触发时间(超时时间)ReleaseFunc _release;//当定时任务被触发时,删除TimerWheel时间轮中的定时任务对象,析构时执行bool _isCancel;//取消定时任务,false表示没有被取消,true表示被取消
public://构造函数TimerTask(uint64_t id,uint32_t timeout,const TaskFunc& task):_id(id),_timeout(timeout),_task(task),_isCancel(false){}//析构函数~TimerTask(){if(_isCancel==false) _task();//在析构函数中执行定时任务_release();//在析构函数中删除时间轮中的定时任务对象}//设置删除定时任务的函数void SetRelease(ReleaseFunc release){_release=release;}//获取定时任务的时间uint32_t GetTimeout(){return _timeout;}//取消定时任务(只能考虑在定时任务本身取消,而不是在时间轮中释放定时任务,因为释放定时任务等于提前执行定时任务,而不是取消)void Cancel(){_isCancel=true;}
};using SharedTask=std::shared_ptr<TimerTask>;
using WeakTask=std::weak_ptr<TimerTask>; //-------------------------------------------------------------------------------------------------------------------////时间轮:存储定时任务,并使用秒针来确定定时任务何时被执行
class TimerWheel
{
private:int _tick;//秒针int _capacity;//时间轮容量,本质是时间轮的最大延迟时间std::vector<std::vector<SharedTask>> _wheels;//二维数组存放定时任务,并且定时任务使用shared_ptr智能指针封装std::unordered_map<uint64_t,WeakTask> _timers;//建立定时任务序号和定时任务weak_ptr的映射关系,所有的定时任务都使用weak_ptr管理//因为当需要延迟定时任务时,增添相同的定时任务要使用shared_ptr针对shared_tr拷贝才会共享引用计数//如果直接对原始对象构造shared_ptr不会共享引用计数,因此使用weak_ptr管理原始对象,//所有的shared_ptr都是针对weak_ptr的拷贝,共享引用计数,但是weak_ptr本身没有引用计数private://删除时间轮中的定时任务void RemoveTimer(uint64_t id){auto it=_timers.find(id);if(it!=_timers.end()){_timers.erase(id);}}
public://构造函数TimerWheel():_tick(0),_capacity(60),_wheels(_capacity){}//析构函数~TimerWheel(){}//添加定时任务void AddTimerTask(uint64_t id,uint32_t timeout,const TaskFunc& task){//构建定时任务TimerTask对象SharedTask st(new TimerTask(id,timeout,task));st->SetRelease(std::bind(&TimerWheel::RemoveTimer,this,id));//在哈希表中建立定时任务序号和定时任务weak_ptr对象的映射关系_timers[id]=WeakTask(st);//在时间轮中添加定时任务_wheels[(_tick+st->GetTimeout())%_capacity].emplace_back(st);}//延迟/刷新定时任务:通过WeakTask构建出新的SharedTask智能指针,再将新的智能指针添加到时间轮中void RefreshTimerTask(uint64_t id){//通过WeakTask的lock函数构建出新的SharedTask智能指针auto it=_timers.find(id);if(it==_timers.end()){return;}SharedTask st=it->second.lock();//将新的智能指针添加到时间轮中_wheels[(_tick+st->GetTimeout())%_capacity].emplace_back(st);}//执行定时任务:时间轮的秒针指向哪里,哪里的定时任务就要被触发执行(本质是释放此处的SharedTask,引用计数-1)void RunTimerTask(){//int n=_wheels[_tick].size();// for(int i=0;i<n;i++)// {//     _wheels[_tick].pop_back();// }//秒针+1_tick=(_tick+1)%_capacity;//执行任务,即销毁shared_ptr对象(具体是否销毁取决于引用计数)_wheels[_tick].clear();}//取消定时任务void CancelTimerTask(uint64_t id){auto it=_timers.find(id);if(it==_timers.end()){return;}SharedTask st=it->second.lock();//通过weak_ptr构建出shared_ptrif(st!=nullptr) st->Cancel();//取消定时任务}
};//测试时间轮定时器
void Task()
{std::cout<<"任务处理中......"<<std::endl;std::cout<<"任务处理完毕!"<<std::endl;std::cout<<"--------------------"<<std::endl;
}
int main()
{TimerWheel tw;tw.AddTimerTask(1,3,std::bind(Task));tw.AddTimerTask(2,5,std::bind(Task));tw.AddTimerTask(3,9,std::bind(Task));tw.AddTimerTask(4,20,std::bind(Task));tw.AddTimerTask(4,20,std::bind(Task));//模拟30秒的时间for(int i=0;i<30;i++){std::cout<<i+1<<"秒:"<<std::endl;sleep(1);tw.RunTimerTask();//时间轮的秒针向后走1秒}return 0;
}

相关文章:

timerfd定时器时间轮定时器

目录 一、timerfd定时器 二、timerfd定时器代码演示 三、时间轮定时器 一、timerfd定时器 timerfd是一种通过文件描述符管理定时器的机制 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); 作用&#xff1a;创建定时器的文件描述符 返回值&…...

什么是数据中心代理IP?有哪些用途?

在海外代理IP的选择中&#xff0c;数据中心代理IP是一个热门选项。这些代理服务器为用户分配了非ISP&#xff08;互联网服务提供商&#xff09;提供的IP地址&#xff0c;而是由第三方云服务提供商所提供的&#xff0c;通常位于数据中心内的服务器上&#xff0c;由托管和云公司所…...

机器学习分类模型性能评估:应对类别不平衡的策略与指标

在机器学习的世界里&#xff0c;模型们就像一群努力破案的侦探&#xff0c;而数据就是它们的“犯罪现场”。今天&#xff0c;咱们的主角——一个自命不凡的分类模型&#xff0c;接到了一个看似简单的任务&#xff1a;揪出那些患有罕见疾病的患者。这听起来是不是很容易&#xf…...

论文导读 - 基于边缘计算、集成学习与传感器集群的便携式电子鼻系统

基于边缘计算、集成学习与传感器集群的便携式电子鼻系统 原论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此论文&#xff08;GB/T 7714-2015&#xff09;&#xff1a; WANG T, WU Y, ZHANG Y, et al. Portable electr…...

Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车

随着对先进、高耗电量的系统的需求日益增长&#xff0c;电气化进程不断加速&#xff0c;汽车行业正处于一个十字路口。现代汽车面临着关键挑战&#xff0c;即满足不断增长的电力需求&#xff0c;特别是高级驾驶辅助系统(ADAS)等关键技术的需求。 由于现今的汽车比以往需要更多的…...

[密码学实战]SDF之密钥管理类函数(二)

[密码学实战]SDF之密钥管理类函数(二) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-af5D1B1iHx3K8vSU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...

多实例情况下,实例名较长dbca失败

dbca创建数据库&#xff0c;但是失败&#xff0c;提示ORA-01158 看来千锤百炼的dbca脚本还是菜&#xff0c;直觉上讲不应该mount上&#xff0c;看一下Action 本地已存在多个实例且名称前缀类似&#xff0c;下一步应该分析dbca日志和实例的alert.log 改为 一个简短的实例名就…...

模电——PN结

一、铺垫 这篇文章将会吊打一切、只会从电子、电场力的角度来阐述PN结为啥会形成、和变薄、变厚&#xff1b;不再考虑空穴这种东西&#xff1b;——提出空穴的人&#xff0c;真不是东西 我敢打赌&#xff0c;全网&#xff0c;我的说法不一定对&#xff0c;但是绝对是唯一可以…...

c++11 : 特殊类设计

目录 一 设计一个类&#xff1a;只能在堆上创建对象 二 设计一个类&#xff1a;只能在栈上创建对象 三 设计一个类&#xff1a;不能被拷贝 四 设计一个类&#xff1a;不能被继承 五 设计一个类: 只能创建一个对象(单例模式) 六 饿汉和懒汉模式的对比 一 设计一个类…...

算法笔记.kruskal算法求最小生成树

题目&#xff1a;&#xff08;来源&#xff1a;AcWing&#xff09; 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向…...

量子算法调试:Grover算法搜索空间压缩过程可视化方案

一、Grover算法核心原理回顾 Grover算法通过以下两步迭代实现搜索空间压缩: Oracle操作(相位翻转) 标记目标状态: Uω∣x⟩={−∣x⟩x=ω∣x⟩x≠ωUω​∣x⟩={−∣x⟩∣x⟩​x=ωx=ω​ 扩散操作(振幅放大) 执行反转平均操作: D=2∣s⟩⟨s∣−ID=2∣s⟩⟨s∣−I 其…...

零基础搭建AI作曲工具:基于Magenta/TensorFlow的交互式音乐生成系统

引言&#xff1a;当AI遇见莫扎特 “音乐是流动的建筑”&#xff0c;当人工智能开始理解音符间的数学规律&#xff0c;音乐创作正经历着前所未有的范式变革。本文将手把手教你构建一套智能作曲系统&#xff0c;不仅能够生成古典钢琴小品&#xff0c;还能实现巴洛克与爵士风格的…...

springboot项目文件上传到服务器本机,返回访问地址

文件上传到服务器本机&#xff0c;然后给出访问地址&#xff1a; 具体如下&#xff1a; 1、添加必要的工具类依赖 <!-- 文件上传工具类 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>…...

mysql community 8.0.23升级到8.0.42再到8.4.5

近日生产服务器准备正式试运行&#xff0c;数据进入客户的专有网络&#xff0c;于是甲方派了人过来测漏洞&#xff0c;结果扫出一大堆。其间关于mysql的漏洞300多个&#xff0c;吓死人。给出的补丁地址&#xff0c;打开来看&#xff0c;全部是英文&#xff0c;可能是一些什么测…...

ubuntu安装docker,conda,tmux,btop,nvitop

在 Ubuntu 上安装 Docker Engine (使用华为云源) 1. 更新系统软件包 sudo apt update sudo apt upgrade -y2. 安装必要的依赖包 sudo apt install -y \ca-certificates \curl \gnupg \lsb-release \git \vim \wget3. 添加 Docker 的 GPG 密钥 (来自华为云镜像) # 创建用于存…...

大模型在肝硬化腹水风险预测及临床方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化腹水术前风险 3.1 术前风险因素分析 3.2 大模型预测术前…...

孙宇晨将出席迪拜Token2049 与特朗普次子共话加密未来

据官方消息,波场TRON创始人孙宇晨将出席5月1日在迪拜举办的Token2049峰会上,并与特朗普次子埃里克特朗普(Eric Trump)进行一场备受瞩目的炉边对话,出席对话的人士还包括特朗普家族支持的去中心化金融项目WLFI(World Liberty Financial)的联合创始人Zach Witkoff。这场对话不仅彰…...

深入理解同源策略与跨域资源共享(CORS)

深入理解同源策略与跨域资源共享&#xff08;CORS&#xff09; 前言 在当今的 Web 开发中&#xff0c;跨域资源请求已成为常见需求。然而&#xff0c;浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;作为最基础的安全机制&#xff0c;限制了不同源之间的资源交互…...

Vue 生命周期钩子总结

Vue 生命周期钩子总结 Vue 组件的生命周期钩子允许在组件不同阶段执行自定义逻辑。以下是各阶段的钩子函数及其用途、触发时机和注意事项&#xff1a; 1. 生命周期阶段概览 Vue 组件的生命周期分为四个主要阶段&#xff1a; 创建&#xff08;Creation&#xff09;&#xff1…...

【解决方案】Linux解决CUDA安装过程中GCC版本不兼容

Linux解决CUDA安装过程中GCC版本不兼容 目录 问题描述 解决方法 安装后配置 问题描述 Linux环境下安装 CUDA 时&#xff0c;运行sudo sh cuda_10.2.89_440.33.01_linux.run命令出现 “Failed to verify gcc version.” 的报错&#xff0c;提示 GCC 版本不兼容&#xff0c;查…...

网络准入控制系统推荐:2025年构建企业网络安全的第一道防线

随着信息技术的飞速发展&#xff0c;企业网络环境日益复杂&#xff0c;阳途网络准入控制系统作为一种先进的网络安全解决方案&#xff0c;其核心是确保网络接入的安全性。 一、网络准入控制系统的基本原理与功能 网络准入控制以“只有合法的用户、安全的终端才可以接入网络”为…...

AI Agent

李宏毅&#xff1a;从零开始搞懂 AI Agent - 知乎台大李宏毅2025 AI Agent新课来了&#xff01; - 知乎读懂AI Agent&#xff1a;基于大模型的人工智能代理 - 知乎 1.什么是AI Agent 一个基于大模型的 AI Agent 系统可以拆分为大模型、规划、记忆与工具使用四个组 件部分。AI A…...

大模型如何应对内容安全:原理、挑战与技术路径探讨

随着大语言模型&#xff08;LLM&#xff09;技术的广泛应用&#xff0c;从AI写作助手到智能客服、再到生成式内容平台&#xff08;AIGC&#xff09;&#xff0c;AI 正以前所未有的速度深入人类社会的各个角落。然而&#xff0c;随之而来的内容安全问题也日益凸显&#xff1a;模…...

Flinkcdc 实现 MySQL 写入 Doris

Flinkcdc 实现 MySQL 写入 Doris Flinkcdc 实现 MySQL 写入 Doris 一、环境配置 Doris&#xff1a;3.0.4 JDK 17 MySQL &#xff08;业务数据库&#xff09;&#xff1a;5.7 MySQL&#xff08;本地数据库&#xff09;&#xff1a;5.7 Flink&#xff1a;flink-1.19.1 flinkc…...

vim粘贴代码格式错乱 排版错乱 缩进错乱 解决方案

从IDE复制代码, 粘贴到vim打开的文件 出现以下格式错乱解决方案 在使用 Vim 编辑器粘贴代码时&#xff0c;出现格式错乱的问题&#xff0c;通常是因为 Vim 的自动缩进功能与粘贴的代码发生了冲突。Vim 默认会尝试对输入的内容进行自动缩进&#xff0c;这会导致粘贴的代码被错误…...

发那科机器人(基本操作、坐标系、I/O通信)

发那科机器人(基本操作、坐标系、I/O通信) 一,机器人基本操作1,坐标系种类2,机器人手动操作一关节运动3,机器人手动操作一直角运动二,坐标系建立1,工具坐标系建立原理及验证方法2,工具坐标系建立步骤3,用户坐标系建立原理及验证方法4,用户坐标系建立步骤三,I/O通信…...

GPU 架构入门笔记

引文位置&#xff1a;https://www.trainy.ai/blog/gpu-utilization-misleading 相关概念是通过 ChatGPT 迅速学习总结而成。 概念&#xff1a; GPU H100 GPU, with 144 SMs 每个 SM&#xff08;streaming multiprocessors&#xff09; 的架构&#xff1a; GPU Utilizati…...

centos7使用yum快速安装Docker环境

一、基础环境设置 1&#xff1a;关闭防火墙和内核安全机制 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02&#xff1a;配置网络yum源 [rootlocalhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Cento…...

解密面试高频题:加权轮询负载均衡算法 (Java 实现)

在分布式系统设计和面试中&#xff0c;负载均衡是一个绕不开的话题。而加权轮询&#xff08;Weighted Round Robin, WRR&#xff09;作为一种经典且实用的负载均衡策略&#xff0c;经常出现在笔试题和面试环节中。本文将带你深入理解 WRR 算法的原理&#xff0c;并探讨几种常见…...

Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器

延时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的&#xff0c;不会重复执行 当延迟任务产生输出后&#xff0c;这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中默认系统中的所有普通…...

高效运维,智慧监测:COMEM光纤温度测量系统在电力行业中的应用

在电力行业中&#xff0c;变压器的稳定运行对于整个电网的安全很重要。为了确保变压器的健康状态&#xff0c;实时、精确的温度监测成为了不可或缺的一环。COMEM光纤温度测量系统应运而生&#xff0c;为变压器的温度监测提供了创新的解决方案。 变压器温度监测的重要性 变压器在…...

TP5兼容达梦国产数据库

1.首先数据库安装&#xff0c;部署时需配置大小写不敏感 2.安装PHP达梦扩展&#xff0c;一定要是对应版本&#xff08;兼容操作系统&#xff09;的扩展&#xff0c;否则会出现各种报错。参考官方文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new…...

[leetcode]2302.统计得分小于k的子数组

1.题目 2.事例 3.数据规模 4.思路&#xff08;滑动窗口&#xff09; 4.1滑动窗口的定义 滑动窗口是一种在数组、字符串等序列数据结构上进行操作的算法技巧。以下是其定义及相关要素的详细介绍&#xff1a; 定义&#xff1a;滑动窗口可以理解为在一个序列上&#xff0c;用一…...

Linux网络编程:TCP多进程/多线程并发服务器详解

Linux网络编程&#xff1a;TCP多进程/多线程并发服务器详解 TCP并发服务器概述 在Linux网络编程中&#xff0c;TCP服务器主要有三种并发模型&#xff1a; 多进程模型&#xff1a;为每个客户端连接创建新进程多线程模型&#xff1a;为每个客户端连接创建新线程I/O多路复用&am…...

Nacos源码—1.Nacos服务注册发现分析二

大纲 1.客户端如何发起服务注册 发送服务心跳 2.服务端如何处理客户端的服务注册请求 3.注册服务—如何实现高并发支撑上百万服务注册 4.内存注册表—如何处理注册表的高并发读写冲突 2.服务端如何处理客户端的服务注册请求 (1)客户端自动发送服务注册请求梳理 (2)Nacos…...

设备指纹护航电商和金融反欺诈体系建设

众所周知&#xff0c;人的指纹具有唯一性&#xff0c;可以作为人的身份识别标识。对于设备而言&#xff0c;也有可以用于识别的特征。设备指纹是指可以用于唯一标识出某一设备的特征或者独特的设备标识&#xff0c;具有固定性、较难篡改性、唯一性等特质。 设备指纹是金融机构…...

FFmpeg源码学习---ffmpeg

1、ffmpeg源码主函数 ┌────────────────────┐ │ main() │ └─────────┬───────────┘ ↓ ┌────────────────────┐ │ 初始化 (日志/网络等) │ │ init_dynload() │ │ avf…...

leetcode 206. 反转链表

题目描述&#xff1a; 迭代法&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …...

NVIDIA新模型DAM-3B:描述一切,图像视频局部描述新突破

在数字时代&#xff0c;图像和视频内容爆炸式增长&#xff0c;如何让AI像人类一样精准描述画面中的特定区域&#xff0c;成为计算机视觉领域的核心挑战。传统模型要么丢失细节&#xff0c;要么缺乏上下文&#xff0c;而NVIDIA与UC Berkeley联合团队提出的DAM&#xff08;Descri…...

7、langChain和RAG实战:基于LangChain和RAG的常用案例实战

PDF 文档问答ChatBot 本地上传文档 支持 pdf支持 txt支持 doc/docx问答页面 python环境 新建一个requirements.txt文件streamlit python-docx PyPDF2 faiss-cpu langchain langchain-core langchain-community langchain-openai然后安装相应的包pip install -r requirements.t…...

c++11: 类型转换

目录 一 C语言中的类型转换 二 . C强制类型转换 1. static_cast 2. reinterpret_cast 3. const_cast 4. dynamic_cast 三 explicit 关键字 一 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff…...

Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突

1.变量名称的命名规则 有效的变量名称以字母开头&#xff0c;后跟字母、数字或下划线&#xff0c;Matlab变量名称对字母大小写是区分的&#xff0c;A和a是不相同的变量&#xff0c;不能使用与Matlab关键字冲突的变量名称&#xff0c;例如if、end等&#xff0c;判断一个字符是不…...

西门子PLC结构化编程_水处理系统水泵多备多投

文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …...

AutoGen 框架深度解析:构建多智能体协作的事件驱动架构

在当下多智能体(Multi-Agent)AI系统快速发展的背景下,AutoGen 作为微软研究院开源的编程框架,为构建可扩展、灵活且可调试的智能体协作应用提供了完备的工具与最佳实践。本文将从设计动机、核心架构、关键概念、安装与快速上手、典型场景、进阶特性、生态与扩展、最佳实践,…...

算法相关概念

1 算法概述 1.1 算法概念 算法是特定问题求解步骤的描述&#xff0c;也是独立存在的一种解决问题的思想和方法 对于算法而言&#xff0c;实现他的编程语言无关紧要&#xff0c;重要的是思想和方法&#xff01;&#xff01;&#xff01; 公式&#xff1a;程序算法数据结构&a…...

《Astro 3.0岛屿架构让内容网站“脱胎换骨”》

内容优先的网站越来越成为主流。无论是新闻资讯、知识博客&#xff0c;还是电商产品展示&#xff0c;用户都希望能快速获取所需内容&#xff0c;这对网站的性能和体验提出了极高要求。而Astro 3.0的岛屿架构&#xff0c;就像是为内容优先网站量身定制的一把神奇钥匙&#xff0c…...

Vue3 + Element-Plus + 阿里云文件上传

Element-Plus 阿里云文件上传 1、选择文件夹方法2、Chrome 浏览器查看 input typefile 元素上传的文件方法3、上传文件4、FormDataFormData 是什么创建 FormDataFormData 常用方法FormData 的实际应用性能与注意事项总结 1、选择文件夹方法 input typefile 元素想要上传文件夹…...

【Linux】第十一章 管理网络

目录 1.TCP/IP网络模型 物理层&#xff08;Physical&#xff09; 数据链路层&#xff08;Date Link&#xff09; 网络层&#xff08;Internet&#xff09; 传输层&#xff08;Transport&#xff09; 应用层&#xff08;Application&#xff09; 2. 对于 IPv4 地址&#…...

用vite动态导入vue的路由配置

在Vue应用中&#xff0c;通过路由可以实现不同页面之间的切换&#xff0c;同时也可以实现页面之间的传参和控制页面的显示与隐藏。但是我们在开发的过程中&#xff0c;会发现在路由配置中的路由配置和我们的项目结构高度重复&#xff0c;在我们修改页面文件结构时非常的麻烦与复…...

sources.list.d目录

sources.list可能大家很熟悉&#xff0c;是配置镜像链接的地方。 sources.list.d其实就是一个目录&#xff0c;在linux系统中.d后缀一般定义为一个目录&#xff0c;且很喜欢用这种方式。 这种方式有一个好处&#xff0c;就是修改不会影响到sources.list文件&#xff0c; 在这里…...