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

libevent详解

目录

一、安装libevent库

二、libevent

三、基于 libevent 实现信号处理与定时任务

四、基于 libevent 的事件驱动 TCP 服务端代码


一、安装libevent库

sudo su

apt install libevent-dev

二、libevent

libevent 是一个轻量级网络i/o库,i/o框架库,封装了select,poll,epoll ,跨平台支持,支持linux,window,unix。统一事件源,libevent对i/o事件,信号和定时事件提供统一的处理。线程安全,使用libevent_pthreads库来提供线程安全支持。基于reactor模式实现多种 I/O 模型和事件处理提供统一接口,助力开发者编写高效、可扩展的网络服务器和客户端程序,尤其适用于大量并发连接场景

提供了一个libevent库,定义事件提供一个文件描述符关注什么事件读或者写还要一个回调函数fun,添加事件,添加到libevent库中。事件循环libevent库通过io检测调用select,poll,epoll。自己决定用什么方法(其实是调用libevent中的库函数,就等于完成了事件循环添加事件的启动) ,然后将就绪的描述符放到类似于就绪队列中,然后调用就绪描述符的回调函数

三、基于 libevent 实现信号处理与定时任务

这段代码利用 libevent 库实现了信号处理和定时任务功能。libevent 是一个跨平台的事件驱动库,能简化处理 I/O 事件、信号和定时事件的过程。代码主要实现了捕获 SIGINT 信号(通常是用户按下 Ctrl + C 时产生)并输出信号编号,同时设置了一个 5 秒的定时器,定时器到期时输出 time out 信息。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <event.h>// 信号处理回调函数
// 当捕获到指定信号时,此函数会被调用
// fd: 信号编号
// event: 事件类型,用于判断是否为信号事件
// arg: 用户传递的参数,这里未使用
void sig_cb(int fd, short event, void* arg)
{// 检查事件类型是否为信号事件if( event & EV_SIGNAL){// 若是信号事件,打印信号编号printf("sig=%d\n",fd);}}// 定时器回调函数
// 当定时器到期时,此函数会被调用
// fd: 未使用
// event: 事件类型,用于判断是否为定时器事件
// arg: 用户传递的参数,这里未使用
void timeout_cb(int fd, short event, void* arg)
{// 定时器到期,打印提示信息printf("time out\n");
}int main()
{// 创建libevent实例,event_init函数会初始化一个事件循环基础对象// base指向这个对象,后续的事件操作都基于此对象struct event_base * base = event_init();// 检查libevent实例是否创建成功if( NULL == base ){// 若创建失败,以状态码1终止程序exit(1);}// 添加事件// 处理Ctrl + C产生的SIGINT信号// evsignal_new函数用于创建一个信号事件对象// base: 之前创建的libevent实例// SIGINT: 要监听的信号,即Ctrl + C产生的中断信号// sig_cb: 信号触发时调用的回调函数// NULL: 用户传递的参数,这里不使用struct event * sig_ev = evsignal_new(base,SIGINT,sig_cb,NULL);// 检查信号事件对象是否创建成功if( sig_ev != NULL){// 若创建成功,将信号事件注册到libevent实例中// NULL表示使用默认的时间设置event_add(sig_ev,NULL);}// 定时事件// evtimer_new函数用于创建一个定时器事件对象// base: 之前创建的libevent实例// timeout_cb: 定时器到期时调用的回调函数// NULL: 用户传递的参数,这里不使用struct event*  time_ev = evtimer_new(base,timeout_cb,NULL);// 定义一个timeval结构体,设置定时器的超时时间// {5, 0} 表示5秒,0微秒struct timeval tv = {5,0};// 检查定时器事件对象是否创建成功if( time_ev != NULL ){// 若创建成功,将定时器事件注册到libevent实例中// &tv: 指向timeval结构体的指针,指定定时器的超时时间event_add(time_ev,&tv);}// 启动事件循环// event_base_dispatch函数会进入一个循环,不断监听注册的事件// 当有事件发生时,调用相应的回调函数event_base_dispatch(base);// 释放定时器事件对象的内存event_free(time_ev);// 释放信号事件对象的内存event_free(sig_ev);// 释放libevent实例的内存event_base_free(base);// 程序正常退出,返回状态码0exit(0);
}

timeout只能执行一次,但是按下ctrl+c后信号可以一直执行。ctrl+/结束。因为信号是永久性事件

如果换成下面的代码:

四、基于 libevent 的事件驱动 TCP 服务端代码

该程序通过 libevent 库实现了一个简单的 TCP 服务器,使用事件驱动的方式处理客户端连接和数据接收。当有新的客户端连接时,接受连接并为其创建一个事件对象,监听可读事件;当客户端发送数据时,接收数据并发送响应;当客户端关闭连接时,释放相关资源。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <event.h>int socket_init();
void recv_data(int c, short ev, void* arg)
{struct event* c_ev = NULL;struct event**p = (struct event**)arg;if( p != NULL){c_ev = *p;  }if( ev & EV_READ){char buff[128] = {0};int n = recv(c,buff,127,0);if( n <= 0 ){event_free(c_ev);//先从libevent中移除事件,然后free释放内存空间close(c);free(p);printf("client close(%d)\n",c);return;}printf("recv(%d)=%s\n",c,buff);send(c,"ok",2,0);}}
void accept_client(int sockfd, short ev, void* arg)
{struct event_base* base = (struct event_base*)arg;if( ev & EV_READ){int c = accept(sockfd,NULL,NULL);if( c < 0){return;}printf("accept c =%d\n",c);struct event** p = (struct event**)malloc(sizeof(struct event*));if( p != NULL ){*p = event_new(base,c,EV_READ|EV_PERSIST,recv_data,p);event_add(*p,NULL);}}
}
int main()
{int sockfd = socket_init();if( -1 == sockfd ){exit(1);}struct event_base * base = event_init();if( base == NULL ){exit(1);}struct event* sock_ev = event_new(base,sockfd,EV_READ|EV_PERSIST,accept_client,base);if( sock_ev != NULL){event_add(sock_ev,NULL);}event_base_dispatch(base);event_free(sock_ev);event_base_free(base);close(sockfd);exit(0);
}
int socket_init()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if( -1 == sockfd ){return -1;}struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if( -1 == res ){printf("bind err\n");return -1;}res = listen(sockfd,5);if( -1 == res){return -1;}return sockfd;
}

1. 头文件包含

  • stdio.h:提供标准输入输出函数,如 printf
  • stdlib.h:包含内存分配、进程终止等函数,如 mallocexit
  • unistd.h:提供 UNIX 标准的系统调用,如 close
  • string.h:包含字符串处理函数,如 memset
  • sys/socket.h:提供套接字编程相关的函数和结构体。
  • arpa/inet.h:提供 IP 地址转换函数,如 inet_addr
  • netinet/in.h:包含网络地址结构体定义,如 sockaddr_in
  • sys/epoll.h:用于 Linux 下的 I/O 多路复用,libevent 底层可能会使用。
  • event.hlibevent 库的头文件,用于事件驱动编程。

2. socket_init 函数

   

int socket_init()
{// 创建一个 TCP 套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == sockfd){return -1;}// 初始化服务器地址结构体struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");// 将套接字绑定到指定的地址和端口int res = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));if (-1 == res){printf("bind err\n");return -1;}// 开始监听客户端连接,最大允许 5 个连接请求排队res = listen(sockfd, 5);if (-1 == res){return -1;}return sockfd;
}
  • socket(AF_INET, SOCK_STREAM, 0):创建一个 IPv4 的 TCP 套接字。
  • bind:将套接字绑定到本地地址 127.0.0.1 和端口 6000
  • listen:将套接字设置为监听状态,允许最多 5 个客户端连接请求排队等待处理。

3. recv_data 函数

        

void recv_data(int c, short ev, void* arg)
{struct event* c_ev = NULL;struct event** p = (struct event**)arg;if (p != NULL){c_ev = *p;}if (ev & EV_READ){// 定义一个缓冲区用于接收数据char buff[128] = {0};// 从客户端套接字接收数据int n = recv(c, buff, 127, 0);if (n <= 0){// 若接收数据失败或客户端关闭连接event_free(c_ev); // 释放事件对象close(c); // 关闭客户端套接字free(p); // 释放内存printf("client close(%d)\n", c);return;}// 打印接收到的数据printf("recv(%d)=%s\n", c, buff);// 向客户端发送响应 "ok"send(c, "ok", 2, 0);}
}
  • recv:从客户端套接字接收数据。
  • 如果接收数据长度小于等于 0,表示客户端关闭连接或发生错误,释放事件对象、关闭套接字并释放内存。
  • 若接收成功,打印接收到的数据,并向客户端发送响应 "ok"。

4. accept_client 函数

        

void accept_client(int sockfd, short ev, void* arg)
{struct event_base* base = (struct event_base*)arg;if (ev & EV_READ){// 接受客户端连接int c = accept(sockfd, NULL, NULL);if (c < 0){return;}printf("accept c =%d\n", c);// 为客户端套接字分配内存struct event** p = (struct event**)malloc(sizeof(struct event*));if (p != NULL){// 创建一个新的事件对象,监听客户端套接字的可读事件*p = event_new(base, c, EV_READ | EV_PERSIST, recv_data, p);// 将事件对象添加到事件循环中event_add(*p, NULL);}}
}
  • accept:接受客户端的连接请求,返回一个新的客户端套接字。
  • event_new:创建一个新的事件对象,监听客户端套接字的可读事件,并指定回调函数为 recv_data
  • event_add:将事件对象添加到 libevent 的事件循环中。

5. main 函数

        

int main()
{// 初始化服务器套接字int sockfd = socket_init();if (-1 == sockfd){exit(1);}// 初始化 libevent 事件循环struct event_base * base = event_init();if (base == NULL){exit(1);}// 创建一个事件对象,监听服务器套接字的可读事件struct event* sock_ev = event_new(base, sockfd, EV_READ | EV_PERSIST, accept_client, base);if (sock_ev != NULL){// 将事件对象添加到事件循环中event_add(sock_ev, NULL);}// 启动事件循环event_base_dispatch(base);// 释放事件对象event_free(sock_ev);// 释放事件循环对象event_base_free(base);// 关闭服务器套接字close(sockfd);// 程序正常退出exit(0);
}
  • socket_init:初始化服务器套接字。
  • event_init:初始化 libevent 的事件循环。
  • event_new:创建一个事件对象,监听服务器套接字的可读事件,当有新的客户端连接时,调用 accept_client 函数。
  • event_base_dispatch:启动事件循环,开始监听事件。
  • 最后释放资源,关闭套接字并退出程序。

 和用select,poll,epoll写服务器区别:

libevent 库提供了更高级、更简洁、更可移植的方式来编写 TCP 服务器,适合快速开发和维护复杂的网络应用

  • libevent
    • libevent 是一个高级的事件驱动库,它对底层的 I/O 多路复用机制(如 selectpollepoll)进行了封装,提供了统一的接口。使用 libevent 编写 TCP 服务器时,开发者无需关心底层具体使用的是哪种 I/O 多路复用机制,代码更加简洁、易读和易维护。例如,在 libevent 中创建和管理事件只需要调用 event_newevent_add 等函数,而不需要手动处理文件描述符集合的设置和轮询等操作。
    • 示例代码中,只需要关注业务逻辑(如处理客户端连接和数据接收),而事件循环和事件管理等复杂操作都由 libevent 库完成。
  • select、poll、epoll
    • 直接使用 selectpollepoll 编写 TCP 服务器时,需要手动处理很多底层细节。例如,使用 select 时需要手动设置文件描述符集合,并且在每次调用 select 后需要遍历文件描述符集合来判断哪些文件描述符有事件发生;使用 epoll 时需要手动管理 epoll 实例,包括创建、添加和删除文件描述符等操作。代码复杂度较高,尤其是在处理大量文件描述符时,容易出错。

相关文章:

libevent详解

目录 一、安装libevent库 二、libevent 三、基于 libevent 实现信号处理与定时任务 四、基于 libevent 的事件驱动 TCP 服务端代码 一、安装libevent库 sudo su apt install libevent-dev 二、libevent libevent 是一个轻量级网络i/o库&#xff0c;i/o框架库&#xff0c;…...

Solon Cloud Gateway 补充

说明 在「使用 Solon Cloud Gateway 替换Spring Cloud Gateway 」的文章中&#xff0c;有评论说不知道响应式。当时看的是 Solon Cloud Gateway 使用响应式接口&#xff0c;由 Solon-Rx 来实现&#xff0c;是基于 reactive-streams 封装的 RxJava 极简版。目前仅一个接口 Com…...

海外社交软件技术深潜:实时互动系统与边缘计算的极限优化

一、毫秒级延迟之战&#xff1a;下一代实时通信架构 1.1 全球实时消息投递体系设计 图表 代码 性能基准测试&#xff08;跨大西洋传输&#xff09;&#xff1a; 协议/算法组合 平均延迟 99分位延迟 丢包恢复率 WebSocketTLSBBRv2 142ms 298ms 78% QUIC自定义CC 112ms 201ms 92%…...

直播美颜SDK是什么?跨平台美颜SDK开发与接入全解析

当下&#xff0c;越来越多的直播平台、短视频App、社交娱乐应用&#xff0c;开始在画面美化方面加大投入。本文将围绕直播美颜SDK是什么、其背后的核心技术、如何实现跨平台开发、以及接入流程等关键问题&#xff0c;为你全面解析这一技术热点。 一、直播美颜SDK到底是什么&am…...

自学S32k144(18)————芯片锁死问题及成功解锁流程

1.锁死原因 温度过高flash异常操作静电等电压异常问题。。。。 本人出现情况&#xff1a;之前开发板不知什么原因&#xff0c;发生短路&#xff0c;重新置换芯片后&#xff0c;发现芯片在S32DS中无法正常烧录 判断可能是由于焊接时温度过高导致锁死。需解锁芯片。 2.解决方法…...

【免费数据】2000-2020年中国4km分辨率逐日气象栅格数据(含9个气象变量)

逐日气象数据是在很多研究中都会用到的数据&#xff0c;例如验证气候模拟、分析陆地生态系统变化以及识别气候变化下的极端天气条件等研究&#xff0c;尤其是高精度的逐日气象数据对于研究者来说更为常用。 本次我们为大家带来的是2000-2020年中国4km分辨率逐日气象栅格数据&a…...

Android Compose 无网络状态处理全指南:从基础到高级实践

Android Compose 无网络状态界面处理全方案 引言 在移动应用开发中&#xff0c;网络连接不稳定是常见场景。优雅地处理无网络状态能显著提升用户体验。Jetpack Compose 提供了强大的工具来实现各种网络状态下的界面展示。本文将全面介绍在 Compose 中处理无网络状态的多种方案…...

网络规划和设计

1.结构化综合布线系统包括建筑物综合布线系统PDS&#xff0c;智能大夏布线系统IBS和工业布线系统IDS 2.GB 50311-2016综合布线系统工程设计规范 GB/T 50312-2016综合布线系统工程验收规范 3.结构化布线系统分为6个子系统&#xff1a; 工作区子系统&#xff1b;水平布线子系…...

Learning vtkjs之ImageMarchingSquares

体积 等值线处理 介绍 vtkImageMarchingSquares - 对图像&#xff08;或来自体积的切片&#xff09;进行等值线处理 给定一个指定的等值&#xff0c;使用Marching Squares算法&#xff08;3D Marching Cubes算法的2D版本&#xff09;生成等值线。 效果 自己增加了两个小球&…...

前端跨域问题详解:原因、解决方案与最佳实践

引言 在现代Web开发中&#xff0c;跨域问题是前端工程师几乎每天都会遇到的挑战。随着前后端分离架构的普及和微服务的发展&#xff0c;跨域请求变得愈发常见。本文将深入探讨跨域问题的本质、各种解决方案以及在实际开发中的最佳实践。 一、什么是跨域问题&#xff1f; 1.1…...

第五届图像、视觉与智能系统国际会议(ICIVIS 2025)参会通知

大会官网: http://www.icivis.net/ 官方邮箱&#xff1a;icivis163.com 会议地点&#xff1a;杭州师范大学仓前校区&#xff08;余杭塘路2318号&#xff09; 会议时间&#xff1a;2025年5月23日-5月25日 主办单位&#xff1a;杭州师范大学 1.一般会员注册 提交注册表以后…...

PCB设计工艺规范(二)基本布局要求

基本布局要求 1.PCBA加工工序2.对器件以及PCB布局要求 资料来自网络&#xff0c;仅供学习使用。 1.PCBA加工工序 制成板的元件布局应保证制成板的加工工序合理&#xff0c;以便于提高制成板加工效率和直通率。 PCB 布局选用的加工流程应使加工效率最高。 常用 PCBA 的6种主流…...

SWIG 和 JNA / JNI 等 C 接口封装工具及进行 C 接口的封装

SWIG 相关 SWIG 是什么 SWIG 是一个软件开发工具,是一个 封装 C/C++ 动态库供其他编程语言调用的神器。 使用它可以简化不同语言与与 C/C++ 语言的交互。简单点说,SWIG 是一个编译器,它以 C/C++的声明为输入,创建从其他语言包括常见的脚本语言如 Javascript、Perl、PHP、…...

【Bootstrap V4系列】学习入门教程之 布局

Bootstrap V4 学习入门教程之 布局 一、容器1.1 All-in-one 一体化1.2 Fluid 流体1.3 Responsive 快速响应 二、栅格系统2.1 网格选项2.2 自动布局列等宽等宽多线 2.3、设置一列宽度2.4、可变宽度内容 一、容器 容器是Bootstrap中最基本的布局元素&#xff0c;在使用我们的默认…...

Nginx功能全解析:你的高性能Web服务器解决方案

Nginx是一款开源的高性能HTTP和反向代理服务器&#xff0c;同时也是IMAP/POP3/SMTP代理服务器。自2004年推出以来&#xff0c;Nginx因其卓越的性能、稳定性和丰富的功能而广泛应用于各种规模的网站。本文将深入解析Nginx的主要功能&#xff0c;帮助你充分利用这款强大的Web服务…...

OpenAI 2025 4月最新动态综述

2025年4月&#xff0c;OpenAI在人工智能领域持续引领创新浪潮&#xff0c;发布了多项重磅新产品和技术&#xff0c;推动AI进入更加实用和智能的新阶段。以下是近期OpenAI的重点动态整理&#xff1a; 1. GPT-5预览版发布&#xff0c;迈入通用AI工业化时代 2025年4月15日&#…...

综合案例建模(1)

文章目录 滚花手扭螺丝机箱封盖螺丝螺丝孔锥形垫片 滚花手扭螺丝 前视基准面画草图&#xff0c;旋转生成主体 倒角0.5 顶面&#xff0c;草图转换实体引用&#xff0c;去复制边线 生成螺旋线路径 顶面绘制草图 上一步画的草图沿螺旋线扫描切除 镜像扫描特征 阵列镜像扫描特征 创…...

ComfyUI 学习笔记,案例3:img2img

背景 ComfyUI 学习笔记&#xff0c;第三个案例 img2img&#xff0c;官网文档的 安装篇 部分找到桌面版&#xff0c;于是就下载了桌面版本&#xff0c;运行第三个案例。 注意要点&#xff1a; 桌面版安装时检测到本机设备不符合时&#xff0c;需要手动选择安装配置&#xff0…...

水利水电安全员A证考试核心知识点

水利水电安全员A证考试核心知识点 水利水电安全员A证考试主要考查安全生产管理、法律法规、专业技术及应急处理能力&#xff0c;以下是核心知识点&#xff1a; 1. 安全生产法律法规 《安全生产法》&#xff1a;明确企业主体责任、从业人员权利与义务、事故追责等。 《水利工…...

Verilog仿真模块--真随机数生成器

前言 在进行功能仿真时&#xff0c;总是希望仿真条件能覆盖尽量多的情况&#xff0c;因此&#xff0c;经常需要产生随机数作为仿真的输入。Verilog 和 SV 中有能够产生随机数的系统函数 $random&#xff0c;可惜的是此函数产生的随机数是伪随机数&#xff0c;重新再跑一次仿真&…...

融合AI助力医疗提效,华奥系医务系统助力医院数字化升级!

医疗资源供需优化一直是医院关注的重点问题。据此&#xff0c;华奥系科技推出华奥系智能医务管理系统&#xff0c;并基于DeepSeek-R1大模型&#xff0c;自主研发将AI智能诊疗助手融入系统。以“智能驱动效率、数据赋能管理”为核心&#xff0c;打造覆盖医院全场景的数字化解决方…...

UDP报文结构

文章目录 简介UDP报文结构解析UDP的特点使用 UDP 的注意事项 简介 用户数据报协议&#xff08;User Datagram Protocol&#xff0c;UDP&#xff09;是传输层的一种无连接协议&#xff0c;它与TCP相比&#xff0c;没有复杂的连接建立、维护和拆解过程&#xff0c;在传输效率上具…...

综合开发-手机APP远程控制PLC1500柱灯的亮灭

要通过 ​​Unity3D​​ 开发的手机 App 控制 ​​电气柜上面的柱灯&#xff0c;需要WIFI模块作为桥梁&#xff0c;按照以下步骤实现&#xff1a; ​​1. 硬件准备&#xff08;硬件部分&#xff09;​​ ​​所需材料​​ ​​ESP32开发板​​&#xff08;如ESP32-WROOM-32&a…...

4:机器人目标识别无序抓取程序二次开发

判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…...

数据结构篇:线性表的另一表达—链表之单链表(下篇)

目录 1.前言 2.是否使用二级指针 3.插入/删除 3.1 pos位置前/后插入 3.2 查找函数 3.3 pos位置删除 3.4 pos位置后面删除 3.5 函数的销毁 4.断言问题 4.1 断言pphead 4.2 断言*pphead 5.三个文件的代码 5.1 头文件 5.2 具体函数实现 5.3 测试用例 1.前言 之前是讲…...

C# 异步详解

C# 异步编程详解 一、异步编程基础概念 1. 同步 vs 异步 ​​同步(Synchronous)​​&#xff1a;任务按顺序执行&#xff0c;前一个任务完成后才会执行下一个​​异步(Asynchronous)​​&#xff1a;任务可以非阻塞地启动&#xff0c;主线程可以继续执行其他操作 2. 异步编…...

X²+1素数问题

X1素数问题是与哥德巴赫猜想和孪生素数猜想同时代的著名数学难题。是否有无穷个正整数x&#xff0c;使得x1总是素数&#xff1f; 其困难程度不亚于哥德巴赫猜想。特别是100多年以来&#xff0c;许许多多一流数论学者对这个问题进行了研究。 X1素数 X1素数是一个著名的猜想&…...

【自定义控件实现最大高度和最大宽度实现】

背景 开发中偶尔遇到控件宽度或者高度在自适应的情况下&#xff0c;有个边界值&#xff0c;也就是最大值。 比如高度自适应的情况下最大高度300dp这种场景。 实现 关键节点代码&#xff1a; Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)…...

基于C++的IOT网关和平台4:github项目ctGateway交互协议

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...

DeepSeek谈《凤凰项目 一个IT运维的传奇故事》

《凤凰项目&#xff1a;一个IT运维的传奇故事》&#xff08;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win&#xff09;是Gene Kim、Kevin Behr和George Spafford合著的一部小说&#xff0c;通过虚构的故事生动展现了IT运维中的核心挑战和Dev…...

Spyglass:官方Hands-on Training(一)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译&#xff08;有删改&#xff09;&#xff0c;Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…...

10.idea中创建springboot项目_jdk17

10.idea中创建springboot项目_jdk17 1. 准备工作 安装 JDK 17&#xff1a; 确保已安装 JDK 17&#xff0c;并配置环境变量 JAVA_HOME 指向 JDK 17 的安装路径。在 IntelliJ IDEA 中验证 JDK 配置&#xff1a;File → Project Structure → SDKs。 安装 IntelliJ IDEA&#x…...

指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?

1. GCC 自动循环展开是怎么展开的&#xff1f; 当你使用 -O3 这样的优化选项时&#xff0c;GCC 会分析你的循环。如果它认为展开循环有利可图&#xff0c;它会做类似这样的事情&#xff08;概念上的&#xff09;&#xff1a; 原始循环 (Conceptual C Code): for (int i 0; i …...

hadoop伪分布式模式

以下是 Hadoop 伪分布式模式&#xff08;Pseudo-Distributed Mode&#xff09;的环境搭建步骤。伪分布式模式下&#xff0c;Hadoop 的各个组件&#xff08;如 HDFS、YARN、MapReduce&#xff09;以独立进程运行&#xff0c;但所有服务均部署在单台机器上&#xff0c;模拟多节点…...

C++入门小馆: 模板

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

# 基于 Python 和 jieba 的中文文本自动摘要工具

基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代&#xff0c;快速准确地提取文本核心内容变得至关重要。今天&#xff0c;我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具&#xff0c;帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…...

.NET平台用C#在PDF中创建可交互的表单域(Form Field)

在日常办公系统开发中&#xff0c;涉及 PDF 处理相关的开发时&#xff0c;生成可填写的 PDF 表单是一种常见需求&#xff0c;例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同&#xff0c;带有**表单域&#xff08;Form Field&#xff09;**的文档支持…...

Azure AI Foundry实战:从零开始构建智能应用

1. 引言 在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业关注的焦点。微软的Azure AI Foundry应运而生,为AI应用开发提供了一站式解决方案。本文将带您深入了解Azure AI Foundry,并通过实战指南,帮助您从零开始构建智能应用。 2. Azure AI Found…...

YOLO视觉模型可视化训练与推理测试工具

推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…...

数据清洗的定义跟实际操作

数据清洗的定义 数据清洗&#xff08;Data Cleaning&#xff09; 是指对原始数据进行处理&#xff0c;以纠正、删除或填补不完整、不准确、重复或无关的数据&#xff0c;使其符合分析或建模的要求。数据清洗是数据预处理的关键步骤&#xff0c;直接影响后续分析和机器学习模型…...

如何用AI生成个人职业照/西装照?

一、核心工具推荐与对比 1. 搜狐简单AI • 特点&#xff1a; • 一键生成&#xff1a;上传1张生活照&#xff0c;AI自动生成职业照/西装照&#xff0c;支持商务精英、韩系女主等20模板。 • 自然微调&#xff1a;优化五官比例、柔化法令纹&#xff0c;保留个人特色&#xff0…...

Ecology中拦截jquery.ajax请求接口后的数据

功能&#xff1a;获取调用接口之后的数据在进行返回参数重写 首先ecology中一般直接看不到源码的&#xff0c;为什么知道是jquery.ajax请求呢&#xff0c;需要用到开发者工具 点开这里之后就能知道调用接口具体走的是什么逻辑然后返回值又做了哪些操作 一般来说&#xff0c;文…...

基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)

A 1 km daily soil moisture dataset over China based on in-situ measurement (2000-2022) 关键数据集分类地表参数数据集时间分辨率日空间分辨率1km - 10km共享方式开放获取数据大小592.76 GB数据时间范围 1999-12-31 — 2022-12-31 元数据更新时间2024-08-09 数据集摘要 …...

Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度

学习目标&#xff1a; 通过自定义的CronScheduler调度器在兼容标准的调度器的情况下&#xff0c;查询自定义任务表去生成调度任务并分配给celery worker进行执行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章&#xff1a;Celery框架组件分析及使用 学习内容&#xff…...

第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题

一、选择题 第 1 题 单选题 题目:在 C++ 中下列哪个不属于字符型常量 ( )。 A. ‘a’ B. ‘\x2A’ C. ‘@’ D. “F” 答案:D 解析:字符型常量使用单引号括起单个字符(如 A、C),或转义字符(如 B 中的十六进制转义字符)。D 选项 “F” 使用双引号,属于字符串常量,而…...

windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)

服务器数据库的搭建和远程访问 mysql数据库安装&#xff08;详细&#xff09; window安装mysql详细流程 路程&#xff1a;重设MySQL5密码&#xff0c;发现远程服务器原本有一个MySQL5&#xff0c;尝试在服务器本地建立连接被拒绝&#xff0c;因为不知道密码。 &#xff08;1…...

w~大模型~合集14

我自己的原文哦~ https://blog.51cto.com/whaosoft/13884560 #Attention as an RNN Bengio等人新作&#xff1a;注意力可被视为RNN&#xff0c;新模型媲美Transformer&#xff0c;但超级省内 , 既能像 Transformer 一样并行训练&#xff0c;推理时内存需求又不随 token 数…...

2025平航杯—团队赛

2025平航杯团队赛 计算机取证 分析起早王的计算机检材&#xff0c;起早王的计算机插入过USB序列号是什么(格式&#xff1a;1)分析起早王的计算机检材&#xff0c;起早王的便签里有几条待干(格式&#xff1a;1)分析起早王的计算机检材&#xff0c;起早王的计算机默认浏览器是什…...

5、SpringBoot整合RabbitMQ

5.1 工作队列模式 1、生产者 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…...

深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning

深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning Describe Anything: Detailed Localized Image and Video Captioning PDF: https://arxiv.org/pdf/2504.16072 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: htt…...