Linux网络编程day7 线程池
线程池
typedef struct{void*(*function)(void*); //函数指针,回调函数void*arg; //上面函数的参数
}threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; // 用于锁住本结构体pthread_mutex_t thread_counter; //记录忙状态线程个数的锁 -- bust_thr_numpthread_cond_t queue_not_full; //当任务队列满时 , 添加任务的线程阻塞 , 等待此条件变量pthread_cond_t queue_not_empty; //任务队列不为空时,通知等待任务的线程pthread_t *threads; //存放线程池中每个线程的Tid . 数组pthread_t adjust_tid; //存管理线程的tidthreadpool_task_t *task_queue; //任务队列--数组首地址int min_thr_num; //线程池最小线程数int max_thr_num; //线程池最大线程数int live_thr_num; //当前存活线程个数int busy_thr_num; //忙状态线程个数int wait_exit_thr_num; //要销毁的线程个数int queue_front; //task_queue队头下标int queue_rear; //task_queue队尾下标int queue_size; //task_queue队中实际任务数int queue_max_size; //task_queue队列可容纳任务数上限int shutdown; //标志位,线程池使用状态,true or false
};
线程池模块分析
1、main():创建线程池
向线程池中添加任务,借助回调处理任务
销毁线程池
int main(void)
{//threadpool_t * threadpool_create(int min_thr_num , int max_thr_num , int queue_max_size);threadpool_t *thp = threadpool_create(3 , 100 , 100);//创建线程池,最大数量100,最小数量3 ,任务队列最
大容量100.printf("pool inited");int num[20] , i; //模拟客户端向服务器发送数据等场景for(i = 0; i < 20 ; i++){num[i] = i;printf("add task %d\n" , i);//int threadpool_add(threadpool_t *pool , void*(*function)(void*arg) , void arg);threadpool_add(thp , process , (void*)&num[i]); //向线程池中添加任务}sleep(10); //等待子线程完成任务threadpool_destroy(thp);return 0 ;
}
2、pthreadpool_create:创建线程池结构体指针
初始化线程池结构体中N个成员变量
创建N个任务线程
创建1个管理者线程
失败时 , 释放空间
threadpool_t* threadpool_create(int min_thr_num , int max_thr_num , int queue_max_size)
{int i ;struct threadpool_t *pool = NULL; // 线程池 结构体do{if((pool = (struct threadpool_t*)malloc(sizeof(struct threadpool_t))) == NULL){printf("malloc threadpool fail");break;}pool->min_thr_num = min_thr_num;pool->max_thr_num = max_thr_num;pool->busy_thr_num = 0;pool->live_thr_num = min_thr_num; //活着的线程数 初值=最小线程数pool->wait_exit_thr_num = 0;pool->queue_size = 0; //有0个产品pool->queue_max_size = queue_max_size;//最大任务队列数pool->queue_front = 0;pool->queue_rear = 0;pool->shutdown = false; // 不关闭线程池/*根据最大线程上线数 , 给工作线程数组开辟空间,清零*/pool->threads = (pthread*)malloc(sizeof(pthread_t)*max_thr_num);if(pool->threads == NULL){printf("malloc threads fail");break;}memset(pool->threads , 0 , sizeof(pthread_t)*max_thr_num);/*给任务队列开辟空间 */pool->task_queue = (threadpool_task_t*)malloc(sizeof(threadpool_task_t)*queue_max_size);if(pool->task_queue == NULL){printf("malloc task_queue fail");break;}/*初始化互斥锁、条件变量 , 使用init动态初始化 , 加上进行返回值判断*/if(pthread_mutex_init((&pool->lock) , NULL) != 0|| pthread_mutex_init(&(pool->thread_counter) , NULL) != 0|| pthread_cond_init(&(pool->queue_not_empty) , NULL) != 0|| pthread_cond_init(&(pool->queue_not_full) , NULL) != 0){printf("init the lock or cond fail");break;}/*启动min_thr_num个work thread*/for(i = 0 ; i < min_thr_num ; i++){pthread_create(&(pool->threads[i]) , NULL , threadpool_thread , (void*)pool);//pool指向当前线>程池printf("stat thread 0x%x...\n" , (unsigned int)pool->threads[i]);}pthread_create(&(pool->adjust_tid) , NULL , adjust_thread , (void*)pool);//创建管理者线程return pool;}while(0);threadpool_free(pool); // 前面代码调用失败时,释放pool空间return NULL;
}
3、threadpool_thread():进入子线程回调函数。
接收参数(void*)arg
加锁--》lock--》整个结构体的锁
判断条件变量--》wait
/* 线程池中各个工作线程 */
void* threadpool_thread(void* threadpool)
{struct threadpool_t *pool = (struct threadpool_t*)threadpool;threadpool_task_t task;//任务队列对象while(true){/*刚创建出线程,等待任务队列里面有队列 ,否则阻塞等待任务队列李有任务后再唤醒接收任务*/pthread_mutex_lock(&(pool->lock));//queue_size = 0说明没有任务,调用wait函数阻塞在条件变量上,若有任务,跳过whilewhile((pool->queue_size == 0) && (!pool->shutdown)){printf("thread 0x%x is waiting\n" , (unsigned int)pthread_self());pthread_cond_wait(&(pool->queue_not_empty) , &(pool->lock));//清除指定数目的空闲线程,如果要结束的线程个数大于0,结束线程if(pool->wait_exit_thr_num > 0 ){pool->wait_exit_thr_num--;//如果线程池里线程个数大于最小值时可以结束当前线程if(pool->live_thr_num > pool->min_thr_num){printf("thread 0x%x is exiting\n" , (unsigned int)pthread_self());pool_live_thr_num--;pthread_mutex_unlock(&(pool->lock));pthread_exit(NULL);}}//指定true,要关闭线程池里的每个线程,自行退出-->销毁线程池if(pool->shutdown){pthread_mutex_unlock(&(pool->lock));printf("thread 0x%x is exiting\n" , (unsigned int)pthread_self());pthread_detach(pthread_self());pthread_exit(NULL); // 线程自行结束}//从任务队列获取任务,出队操作task.function = pool->task_queue[pool->queue_front].function;task.arg = pool->task_queue[pool->queue_front].arg;pool->queue_front = (pool->queue_front + 1) % pool->queue_max_size; //出队,模拟环形pool->queue_size--;//通知可以有新的任务添加进来pthread_cond_broadcast(&(pool->queue_not_full));//任务取出后立即将线程池锁释放pthread_mutex_unlock(&(pool->lock));//执行任务printf("thread 0x%x stat working\n" , (unsigned int)pthread_self());pthread_mutex_lock(&(pool->thread_counter)); //忙状态线程数变量锁pool->busy_thr_num++; //忙状态线程数+1pthread_mutex_unlock(&((pool->thread_counter));(*(task.function))(task.arg);//执行回调函数//任务结束处理printf("thread 0x%x end working\n" , (unsigned int)pthread_self());pthread_mutex_lock(&(pool->thread_counter));pool->busy_thr_num--; //处理掉任务,忙状态线程数-1pthread_mutex_unlock(&(pool->thread_counter));}pthread_exit(NULL);
}
4、adjust_thread():进入管理者线程回调函数
循环10s执行一次
接收参数(void*)arg
加锁--》lock--》整个结构体的锁
获取管理线程时需要用到的变量:live busy queue task
根据既定算法,使用上述3变量判断是否应该创建、销毁线程池中的指定步长的线程。
void* adjust_thread(void* threadpool)
{int i ;struct threadpool_t *pool = (struct threadpool_t*)threadpool;while(!pool->shutdown){sleep(DEFAULT_TIME); //定时对线程池管理pthread_mutex_lock(&(pool->lock));int queue_size = pool->queue_size;int live_thr_num = pool->live_thr_num;pthread_mutex_unlock(&(pool->lock));pthread_mutex_lock(&(pool->thread_counter));int busy_thr_num = pool->busy_thr_num;pthread_mutex_unlock(&(pool->pthread_counter));//创建新线程,任务数大于最小线程池个数,且存活线程数少于最大线程数if(queue_size >= MIN_WAIT_TASK_NUM && live_thr_num < pool->max_thr_num){pthread_mutex_lock(&(pool->lock));int add = 0;//一次增加DEFAULT_THREAD个线程for(i = 0 ; i < pool->max_thr_num && add < DEFAULT_THREAD_VARY&& pool->live_thr_num < pool_max_thr_num ; i++){pthread_create(&(pool->thread[i]) , NULL , threadpool_thread , (void*)pool);add++;pool->live_thr_num++;}pthread_mutex_unlock(&(pool->lock));}if((busy_thr_num *2) < live_thr_num && live_thr_num > pool->min_thr_num){pthread_mutex_lock(&(pool->lock));pool->wait_exit_thr_num = DEFAULT_THREAD_VARY;pthread_mutex_unlock(&(pool->lock));for(i = 0 ; i < DEFAULT_THREAD_VARY ; i++){pthread_cond_signal(&(pool->queue_not_empty));}}}return NULL;
}
5、threadpool_add:模拟产生任务 num[20]
设置回调函数,处理任务sleep(1)代表处理完成
初始化任务队列结构体成员 回调函数和arg
利用环形队列机制实现添加任务,借助队尾指针
唤醒阻塞在条件变量上的线程
//线程池中的线程,模拟处理业务
void* process(void*arg)
{printf("thread 0x%x working on task %d\n" , (unsigned int)pthread_self() , (int)arg);sleep(1);printf("task %d is end\n" , (int)arg);return NULL
}
int threadpool_add(struct threadpool_t *pool , (void*)(**function)(void*arg) , (void*)arg)
{pthread_mutex_lock(&(pool->lock));//为真 , 队列已满 , 调用wait阻塞while((pool->queue_size == pool->queue_max_size) && (!pool->shutdown)){pthread_cond_wait(&(pool->queue_not_full) , &(pool->lock));}if(pool->shutdown){pthread_cond_broadcast(&(pool->queue_not_empty));pthread_mutex_unlock(&(pool->lock));return 0 ;}//清空工作线程 调用的回调函数 的参数if(pool->task_queue[pool->queue_rear].arg != NULL){pool->task_queue[pool->queue_rear].arg = NULL;}//添加任务到任务队列pool->task_queue[pool->queue_rear].function = function;pool->task_queue[pool->queue_rear].arg = arg;pool->queue_rear = (pool->queue_rear + 1) % pool->queue_max_size;//队尾指针移动,模拟环形pool->queue_size++;//向任务队列中添加一个任务//添加完任务后,队列不为空,唤醒线程池中等待处理任务的线程pthread_cond_signal(&(pool->queue_not_empty));pthread_mutex_unlock(&(pool->lock));return 0 ;
}
6、从3中wait之后执行,处理任务:获取任务处理回调函数及参数
利用环形队列机制实现处理任务,借助队头指针
唤醒阻塞在条件变量上的server
修改忙线程数量++
执行处理任务线程
修改忙线程数量--
7、创建和销毁线程:管理者线程根据上述三个参数判断是否创建、销毁
满足创建条件pthread_create()回调任务线程函数
满足销毁条件wait_exit_thr_num赋值,signal给阻塞在条件变量上的线程发送假条件满足信号,跳转至wait阻塞,阻塞线程会被假信号唤醒,使用pthread_exit。
int threadpool_destroy(threadpool_t *pool)
{int i;if(pool == NULL)return -1;pool->shutdown = true;pthread_join(pool->adjust_tid , NULL);for(i = 0 ; i < pool->live_thr_num ; i++){pthread_cond_broadcast(&(pool->queue_not_empty));}for(i = 0; i < pool->live_thr_num ; i++){pthread_join(pool->threads[i] , NULL);}threadpool_free(pool);return 0;
}
int threadpool_free(threadpool_t *pool)
{if(pool == NULL)return -1;if(pool->task_queue)free(pool->tast_queue);if(pool->threads){free(pool->threads);pthread_mutex_lock(&(pool->lock));pthread_mutex_destroy(&(pool->lock));pthread_mutex_lock(&(pool->thread_counter));pthread_mutex_destroy(&(pool->thread_counter));pthread_cond_destroy(&(pool->queue_not_full));pthread_cond_destroy(&(pool->queue_not_empty));}free(pool);pool = NULL;return 0;
}
UDP服务器
TCP通信和UDP通信的优缺点
TCP
面向连接的,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式,丢包重传。
优点:稳定 数据流量稳定、速度稳定、顺序
缺点:传输速度慢、效率低,资源开销大。
使用场景:数据完整要求性较高,不追求效率
大数据传输、文件传输。
UDP
无连接的,不可靠的数据报传递。对于不稳定的网络层,采取完全不弥补的通信方式,默认还原网络状况。
优点:传输速度快,效率高,资源开销小。
缺点:不稳定 数据流量、速度不稳定,顺序不稳定
使用场景:对时效性要求较高场合。稳定性其次。
游戏、视频会议、视频电话。
----腾讯、华为、阿里 -- 应用层添加数据校验协议,弥补UDP的不足
UDP实现的C/S模型
无三次握手建立连接,故没有accept()、connect()
recv()/send()只能用于TCP通信
server
server:
lfd = socket(AF_INET , SOCK_DGRAM , 0); SOCK_DGRAM--->报式协议
bind();
listen(); ----可有可无
while(1){ //不使用read函数recvfrom() //涵盖accept函数中的传出地址结构sendto();
}
close();
client
cfd = socket(AF_INET , SOCK_DGRAM , 0);sendto("服务器地址结构" , 地址结构大小)recvfrom()
写屏幕
close()
recvfrom函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
socket:lfd
buf:缓冲区地址
len:缓冲区大小
flags:0
src_addr:传出参数,传出对端地址结构
src_addr:传入传出返回值:成功接收数据字节数
失败-1 errno 0对端关闭
sendto函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
socket:套接字
buf:存储数据的缓冲区
len:数据长度
flags:0
dest_addr:传入参数,目标地址结构
src_addr:地址结构长度返回值:成功写出数据字节数
失败-1 errno
相关文章:
Linux网络编程day7 线程池
线程池 typedef struct{void*(*function)(void*); //函数指针,回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …...
【SpringMVC】详解cookie,session及实战
目录 1.前言 2.正文 2.1cookie与session概念 2.2返回cookie参数 2.3设置session 3.小结 1.前言 哈喽大家好吖,今天继续来给大家来分享SpringMVC的学习,今天主要带来的是cookie与session的讲解以及通过postman和fiddler来实战,废话不多…...
《Vuejs 设计与实现》第 4 章(响应式系统)( 上 )
目录 4.1 响应式数据和副作用函数 4.2 基本响应式数据实现 4.3 设计完善响应系统 4.4 分支切换与清理 4.5 嵌套的 effect 与 effect 栈 4.1 响应式数据和副作用函数 副作用函数是指那些产生副作用的函数 function effect() {document.body.innerText = hello vue3 }执行 …...
《社交应用架构生存战:React Native与Flutter的部署容灾决胜法则》
React Native和Flutter作为当下热门的跨平台开发框架,在社交应用开发领域各显神通。今天,我们深入探索它们在高可用架构中的部署与容灾策略。 React Native凭借其独特优势,在社交应用开发中拥有一席之地。它基于JavaScript和React࿰…...
K8s网络从0到1
K8s网络从0到1 前言 K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等。为了帮助大家理解,模仿TC…...
React Native基础环境配置
React Native基础环境配置 1.引言2.React-Native简介3.项目基础环境搭建1.引言 感觉自己掌握的知识面还是有点太窄了,于是决定看看移动端的框架,搞个react搭一个后端管理项目,然后拿react-native写个小的软件,试着找个三方上架一下应用市场玩玩。毕竟不可能一直在简历上挂一…...
k8s术语之DaemonSet
DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为它们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod 使用DaemonSet的一些典型用法: …...
接口自动化测试框架详解(pytest+allure+aiohttp+ 用例自动生成)
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效…...
Go:简洁高效,构建现代应用的利器
Go,又称 Golang,是由 Google 开发的一种开源编程语言。它以其简洁的语法、高效的性能以及强大的并发特性,在云计算、微服务、DevOps 等领域迅速崛起,成为构建现代应用的利器。本文将带你了解 Go 的魅力,探讨其核心特性…...
Minor GC与Full GC分别在什么时候发生?
一、Minor GC 触发条件 1.Eden区空间不足 • 核心机制:新对象优先分配在Eden区,当Eden区无法满足新对象分配时触发Minor GC。 示例: // 循环创建对象填满Eden区 for (int i 0; i < 1000000; i) {byte[] data new byte[1 * 1024]; // 持…...
Crawl4AI:高效的开源 Python 网页爬取与数据提取库
Crawl4AI:高效的开源 Python 网页爬取与数据提取库 在数据驱动的时代,网页爬取和数据提取是众多 AI 项目及语言模型性能提升的关键环节。Crawl4AI 作为一款开源的 Python 库,凭借强大且灵活的功能,致力于简化这一复杂工作流程。其全异步设计不仅大幅提升了处理速度,还增强…...
【目标检测标签转换工具】YOLO 格式与 Pascal VOC XML 格式的互转详解(含完整代码)
一、写在前面:为什么需要标签格式转换? 在目标检测任务中,不同的模型和标注工具使用的标签格式常常不同: YOLO 系列(YOLOv5/v8) 使用的是 .txt 格式,每行为一个目标,记录相对归一化…...
Redis最新入门教程
文章目录 Redis最新入门教程1.安装Redis2.连接Redis3.Redis环境变量配置4.入门Redis4.1 Redis的数据结构4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.缓存雪崩、击穿、穿透6.1 缓存雪崩6.2 缓冲击穿6.3 缓冲…...
2025年渗透测试面试题总结-某步在线面试(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、操作系统相关问题总结与分析及扩展回答 1. Linux命令熟悉度 2. 查看进程的命令 3. 查看网络进程…...
网络化:DevOps 工程的必要基础(Networking: The Essential Foundation for DevOps Engineering)
李升伟 编译 理解网络化基础知识 你是否曾想过是什么真正让卓越的DevOps工程师与众人区别开来?答案是网络化。是的,对网络的基本理解不仅仅是有帮助的——它是绝对必要的。在当今以微服务、容器和分布式系统为主宰的互联互通世界中,对网络原…...
<template>标签的用法
一、原生的template标签的用法 <template> 是 HTML5 引入的一个标签,用于声明 HTML 片段,这些片段在页面加载时不会被渲染,但可以在运行时通过 JavaScript 实例化和使用。 基本用法 <template id"myTemplate"> <…...
【数据结构】——链表OJ(下)
前面我们已经刷了几道单链表的题目,下面我们继续看几道题目。 一、相交链表 这道题题目的要求是很好理解的,就是现在我们有两个链表,然后我们就相办法进行判断,这两个链表是否是相交的,那么链表的相交其实就是有没有共…...
笔试专题(十六)
文章目录 相差不超过k的最多数题解代码 最长公共子序列(一)题解代码 小红的口罩题解代码 春游题解代码 相差不超过k的最多数 题目链接 题解 1. 排序 滑动窗口 2. 为什么使用滑动窗口? 因为max-min < k,求这个区间内的数最…...
云原生应用全生命周期管理实战:从开发、部署到运维的一体化方案
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、前言:应用交付正在被“云原生”重塑 随着企业IT架构从单体转向微服务,再到全面拥抱容器化与Kubernetes,应用的构建、部署、配置、监控、弹性与治理也正经历一场全方位的变革。传统的开发运维…...
图表制作-带背景色的柱状图
首先登录自己的账号,没有账号的可以注册一个。 登录之后,在左侧菜单栏找到图表制作-统计图。 点击新建统计图,点击柱状图-带背景色的柱状图。 初始会有一些演示数据,可以根据自己的需要进行修改。 如果觉得手动修改太麻烦…...
【Pandas】pandas DataFrame ewm
Pandas2.2 DataFrame Function application, GroupBy & window 方法描述DataFrame.apply(func[, axis, raw, …])用于沿 DataFrame 的轴(行或列)应用一个函数DataFrame.map(func[, na_action])用于对 DataFrame 的每个元素应用一个函数DataFrame.a…...
V 型球阀:多材质多驱动,精准适配复杂严苛工况-耀圣
V 型球阀:多材质多驱动,精准适配复杂严苛工况 在化工、矿业、环保等工业领域,带颗粒介质、料浆以及高腐蚀性介质的输送与控制一直是行业难题。普通阀门在这些复杂工况下,易出现磨损、腐蚀、控制失灵等问题,而 V 型球阀…...
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
接上文 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1) https://blog.csdn.net/coldwind811201/article/details/147607641 1. 更新NuGet包 升级NuGet包后,注意相应修改前面页面上的JS引用为相应新版本的jquery JS脚本 …...
Java响应实体【R】
R响应实体 响应实体R(Response Entity)具体作用说明?1、用与数据传输2、用于状态反馈3、指令与控制 普通响应实体优化后的R:高级响应实体类 响应实体R(Response Entity)具体作用说明? 1、用与数据传输 传输请求结果 :当客户端向…...
短视频矩阵系统批量剪辑模式开发详解,支持OEM
在短视频行业竞争激烈的当下,短视频矩阵系统通过批量剪辑功能实现高效内容生产,成为众多运营者的利器。本文将深入探讨短视频矩阵系统中几种常见批量剪辑模式的开发思路与实现方法,助力开发者构建功能强大的批量剪辑模块。 一、批量剪辑模式概…...
顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
导读:顺丰科技引入 Doris 替换 Presto,在内部可视化数据自助分析工具丰景台场景广泛应用。目前,顺丰临时查询业务、丰景台报表业务的 Presto 场景已经 100% 切换到 Doris 集群中,日均查询量 100W。并实现 P95 性能提升近 3 倍&…...
使用 Cesium 构建 3D 地图应用的实践
CesiumJS 是一个功能强大的开源 JavaScript 库,能够帮助开发者快速构建高性能、高精度的 3D 地球和地图应用 。本文将介绍如何使用 Cesium 构建一个基本的 3D 地图应用,并加载自定义的 3D Tiles 模型。 初始化 Cesium Viewer 首先,在 Vue 的…...
公链钱包开发:技术逻辑与产品设计实践
公链钱包开发:技术逻辑与产品设计实践 ——2025年数字资产管理的范式革命与用户价值重构 一、公链钱包的核心理解:技术逻辑与用户价值的耦合 公链钱包不仅是存储数字资产的工具,更是用户与区块链生态交互的“超级入口”。其核心价值体现在三…...
mobile自动化测试-appium webdriverio
WebdriverIO是一款支持mobile app和mobile web自动化测试框架,与appium集成,完成对mobile应用测试。支持ios 和android两种平台,且功能丰富,是mobile app自动化测试首选框架。且官方还提供了mobile 应用测试example代码࿰…...
【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现
🎵 【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情…...
飞算 用到妙处 AI辅助编程 - 双击方法名,自动识别到上下文中很方便
1. 双击findtasktypedict方法。右侧箭头指向自动识别 2. 按照说的内容机型了修改...
msIT大模型推理迁移调优工具
msIT LLM大模型ATB推理精度工具 适用场景:大模型加速库推理精度分析工具能力:大模型推理精度工具msIT llm,提供基于加速库推理的精度调试工具,支持数据dump、精度比对、单算子预检、溢出检测、模型迁移等能力。 msIT LLM大模型…...
YOGA Air X ILL10(83CX)/YOGA 14 ILL10X(83LC)2025款恢复开箱状态原装出厂Win11系统OEM镜像
适用机型(MTM): 【83LC】链接:https://pan.baidu.com/s/1AwbFR9nccvyzS1pOCToMvA?pwdewjs 提取码:ewjs 【83CX】链接:https://pan.baidu.com/s/1wMRI8ETodVG59GBDVDLgQg?pwdn3nx 提取码:n3nx lenovo联想原装wi…...
使用Deployment部署运行Nginx和Apache服务
1.Deployment简介 : 在Kubernetes(k8s)中,Deployment 是一种核心控制器资源,用于管理无状态应用的声明式部署、扩展与更新。它通过定义应用的期望状态,由控制器自动维护实际状态与期望状态的一致性&#x…...
382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接
之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…...
【 Redis | 实战篇 短信登录 】
前言: 主要完成了基于Session实现登录,解决集群的Session共享问题,从而实现了基于Redis来实现共享Session登录 1.基于Session实现登录 1.1.发送短信验证码 步骤: 前端提交手机号 》校验手机号 》不符合返回错误信息࿰…...
AI(学习笔记第二课) 使用langchain进行AI开发
文章目录 AI(学习笔记第二课) 使用langchain进行AI开发学习内容:1. 使用背景2.创建python(pycharm community版)开发环境并连接deepseek2.1 创建python(pycharm community版)开发环境2.2 创建python工程2.3 写入初始py…...
如何查看某个文件中的特殊符号
Q:如何查看某个文件中的特殊符号,比如说是换行符之类的转义字符? 1,法1:使用cat -A cat -A filename可以看到-A本质上就是-vET,也就是 展示所有的字符,-v是显示非打印字符,这个需…...
venv环境里控制scapy版本和起trex v2.87
要在虚拟环境(venv)中控制Scapy版本并运行TRex v2.87,您可以按照以下步骤操作: 创建一个新的虚拟环境: python3 -m venv trex-env激活创建的虚拟环境。在Linux或macOS上: source trex-env/bin/activate在Wi…...
第五十四篇 AI与数据分析
一、AI数据分析就像做菜 想象你在厨房做一道新菜,AI数据分析的流程其实非常相似: 买菜(获取数据) 去市场挑选新鲜蔬菜 从Excel/数据库获取数据例:pd.read_csv(超市销售表.csv) 洗菜切菜(清洗数据&#x…...
C++面向对象编程入门:从类与对象说起(一)
C语言是面向过程,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,而C面向的是对象,关注的是对象,将一件事拆解成多个对象,靠对象之间互交完成。 目录 类的定义 类的两种定义 …...
openwrt之UCI 增删改查(add/get/set /add_list...)
1,引入 UCI是openwrt的统一配置接口,所有的配置文件被存放在/etc/config/下,使用UCI工具操作具体可查询官网中的开发文章: [OpenWrt Wiki] The UCI systemhttps://openwrt.org/docs/guide-user/base-system/uciconifg <secti…...
TypeScript 中,属性修饰符
在 TypeScript 中,属性修饰符(Property Modifiers)是用于修饰类的属性或方法的关键字,它们可以改变属性或方法的行为和访问权限。TypeScript 提供了三种主要的属性修饰符:public、private 和 protected。此外ÿ…...
LeetCode 3341.到达最后一个房间的最少时间 I:Dijkstra算法(类似深搜)-简短清晰的话描述
【LetMeFly】3341.到达最后一个房间的最少时间 I:Dijkstra算法(类似深搜)-简短清晰的话描述 力扣题目链接:https://leetcode.cn/problems/find-minimum-time-to-reach-last-room-i/ 有一个地窖,地窖中有 n x m 个房间…...
http重新为https
1.先创建一个配置文件 主要方便实验 可以将主配置文件下的location全部注释掉,方便观察 2.配置新配置文件 server{ listen 80; listen 443 ssl; ssl_certificate /usr/local/nginx/conf.d/ssl/www.kgc.com.crt; ssl_certificate_key /usr/local/nginx/conf…...
2025最新免费视频号下载工具!支持Win/Mac,一键解析原画质+封面
软件介绍 适用于Windows 2025 最新5月蝴蝶视频号下载工具,免费使用,无广告且免费,支持对原视频和封面进行解析下载,亲测可用,现在很多工具都失效了,难得的几款下载视频号工具,大家且用且珍…...
CTF杂项入门(BUUCTF-Misc第一页)
写在前面 题目涵盖:BUUCTF 第一页杂项 涉及工具: 随波逐流、foremost、binwalk、honeyview、010editor、zipperello、archpr、wireshark、cyberchef、QR_Research、PNGCRC爆破、stegsolve、Audacity、河马、D盾、routerpassview、steghide,以…...
碰一碰发视频一键成片功能开发实践与技术解析
在数字化营销与内容传播领域,碰一碰发视频技术凭借便捷的交互体验,已成为实体商业引流的重要手段。而一键成片功能的融入,能够让用户在触碰 NFC 标签后,快速获取高质量的视频内容,进一步提升传播效率。本文将从功能需求…...
【CTFer成长之路】举足轻重的信息搜集
举足轻重的信息搜集 信息搜集 常见的搜集 题目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{info_…...
centos搭建dokcer和vulhub
1、换源阿里云 2、安装docker与docker-compose 下载1.29.2 docker compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 如果下载不了,可以…...