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

网络IO与IO多路复用

一、网络IO基础

  • 系统对象
    • 网络IO涉及用户空间调用IO的进程或线程以及内核空间的内核系统。
    • 例如,当进行read操作时,会经历两个阶段:
      1. 等待数据准备就绪。
      2. 将数据从内核拷贝到进程或线程中。
  • 多种网络IO模型的出现原因:由于上述两个阶段的不同情况,出现了多种网络IO模型。

二、阻塞IO(blocking IO)

  • 特点
    • 在Linux中,默认所有socket都是阻塞的。
    • 以读操作为例,当用户进程调用read系统调用,kernel开始IO的第一阶段(准备数据),对于网络IO,数据可能未到,kernel要等待,用户进程会被阻塞。
    • 直到kernel等到数据准备好,将数据从kernel拷贝到用户内存并返回结果,用户进程才解除阻塞状态。
    • 即阻塞IO在等待数据和拷贝数据两个阶段都阻塞进程。
    • 例如,使用listen()send()recv()等接口构建服务器/客户机模型,这些接口大多是阻塞型的。
    • 代码示例:
// 创建服务器端的socket
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
// 绑定地址
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 监听连接
listen(serverSocket, 5);
// 接受连接
int clientSocket = accept(serverSocket, NULL, NULL);
// 接收数据,在此处进程会阻塞,直到接收到数据或出错
char buffer[1024];
recv(clientSocket, buffer, sizeof(buffer), 0);
// 发送数据,在此处进程也可能阻塞
send(clientSocket, buffer, strlen(buffer), 0);
- 解释:上述代码首先创建了一个服务器端的socket,然后绑定地址和端口,接着监听连接。当调用`accept`时,如果没有连接请求,会阻塞等待。一旦有连接,调用`recv`接收数据时,会阻塞直到有数据到达。发送数据时也可能阻塞,例如网络拥堵或接收方接收缓冲区满。
  • 多线程/多进程改进方案
    • 为解决单个连接阻塞影响其他连接的问题,可在服务器端使用多线程或多进程。
    • 多线程可使用pthread_create()创建,多进程使用fork()创建。
    • 多线程开销相对小,适合为较多客户机服务;进程更安全,适合单个服务执行体需要大量CPU资源的情况。
    • 例如,服务器端为多个客户机提供服务时,可在主线程等待连接请求,有连接时创建新线程或新进程提供服务。
    • 但当需要同时响应大量(成百上千)连接请求时,多线程或多进程会严重占用系统资源,导致系统效率下降和假死。

三、非阻塞IO(non-blocking IO)

  • 特点
    • 通过设置socket为非阻塞,如使用fcntl( fd, F_SETFL, O_NONBLOCK );
    • 当用户进程发出read操作,若kernel数据未准备好,不会阻塞用户进程,而是立即返回error
    • 用户进程可根据返回结果判断数据是否准备好,未准备好可再次发送read操作。
    • 当数据准备好,kernel会将数据拷贝到用户内存并返回。
    • 例如,recv()接口在非阻塞状态下调用后立即返回,返回值有不同含义:
      • recv()返回值大于 0,表示接受数据完毕,返回值是接收到的字节数。
      • recv()返回 0,表示连接正常断开。
      • recv()返回 -1,且errno等于EAGAIN,表示recv操作未完成。
      • recv()返回 - 1,且errno不等于EAGAIN,表示recv操作遇到系统错误errno
    • 代码示例:
// 创建服务器端的socket
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
// 设置为非阻塞
fcntl(serverSocket, F_SETFL, O_NONBLOCK);
// 绑定地址
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 监听连接
listen(serverSocket, 5);
// 接受连接
int clientSocket = accept(serverSocket, NULL, NULL);
// 接收数据,此处不会阻塞,会根据返回值判断状态
char buffer[1024];
int recvResult;
while ((recvResult = recv(clientSocket, buffer, sizeof(buffer), 0)) == -1 && errno == EAGAIN) {// 数据未准备好,可进行其他操作或再次尝试接收
}
if (recvResult > 0) {// 处理接收到的数据
} else if (recvResult == 0) {// 连接断开
} else {// 其他错误
}
- 解释:在这个示例中,将服务器端socket设置为非阻塞后,调用`recv`时不会阻塞进程。如果`recv`返回-1且`errno`为`EAGAIN`,说明数据还未准备好,程序可继续执行其他操作或过段时间再尝试接收,而不是像阻塞IO那样一直等待。

四、多路复用IO(IO multiplexing)

  • 特点
    • 又称事件驱动IO(event driven IO),如select/epoll
    • 单个进程可同时处理多个网络连接的IO,基本原理是select/epoll函数不断轮询所负责的所有socket,当某个socket有数据到达,通知用户进程。
    • 流程:用户进程调用select会被阻塞,kernel监视select负责的socket,当有socket数据准备好,select返回,用户进程再调用read操作将数据从kernel拷贝到用户进程。
    • 虽然使用select需要两个系统调用(selectread),但优势是可在一个线程内处理多个socket的IO请求。
    • 代码示例:
#include <stdio.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>int main() {int serverSocket = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8080);serverAddr.sin_addr.s_addr = INADDR_ANY;bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));listen(serverSocket, 5);fd_set readfds;FD_ZERO(&readfds);FD_SET(serverSocket, &readfds);int maxFd = serverSocket;while (1) {fd_set tempFds = readfds;int activity = select(maxFd + 1, &tempFds, NULL, NULL, NULL);if (FD_ISSET(serverSocket, &tempFds)) {int clientSocket = accept(serverSocket, NULL, NULL);FD_SET(clientSocket, &readfds);if (clientSocket > maxFd) {maxFd = clientSocket;}}for (int i = 0; i <= maxFd; i++) {if (FD_ISSET(i, &tempFds) && i!= serverSocket) {char buffer[1024];int valread = recv(i, buffer, 1024, 0);if (valread == 0) {close(i);FD_CLR(i, &readfds);} else {// 处理接收到的数据}}}}return 0;
}
- 解释:首先创建服务器socket,绑定并监听。`FD_ZERO`和`FD_SET`用于初始化和设置文件描述符集合。`select`函数会阻塞,等待集合中文件描述符的可读事件。当`serverSocket`有新连接时,添加新连接的socket到集合,并更新最大文件描述符。当其他socket可读时,接收数据并处理。
  • 接口原型
    • FD_ZERO(int fd, fd_set* fds):初始化fd_set
    • FD_SET(int fd, fd_set* fds):将句柄添加到fd_set
    • FD_ISSET(int fd, fd_set* fds):检查句柄是否在fd_set中。
    • FD_CLR(int fd, fd_set* fds):从fd_set中移除句柄。
    • int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout):用于探测多个文件句柄的状态变化,readfdswritefdsexceptfds作为输入和输出参数,可设置超时时间。
  • 问题
    • 当需要探测的句柄值较大时,select()接口本身需要大量时间轮询,很多操作系统提供更高效接口如epoll(Linux)、kqueue(BSD)、/dev/poll(Solaris)等。
    • 该模型将事件探测和事件响应夹杂,若事件响应执行体庞大,会降低事件探测的及时性。
    • 可使用事件驱动库如libeventlibev库解决上述问题。

五、异步IO(Asynchronous I/O)

  • 特点
    • Linux下的异步IO主要用于磁盘IO读写操作,从内核2.6版本开始引入。
    • 用户进程发起read操作后可做其他事,kernel收到asynchronous read后立刻返回,不会阻塞用户进程。
    • kernel等待数据准备完成,将数据拷贝到用户内存,完成后给用户进程发送信号通知。
    • 代码示例(使用aio_read):
#include <aio.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>void aio_completion_handler(union sigval sigval) {struct aiocb *req = (struct aiocb *)sigval.sival_ptr;if (aio_error(req) == 0) {char *buffer = (char *)malloc(aio_return(req));// 处理读取到的数据free(buffer);}aio_destroy(req);
}int main() {int fd = open("test.txt", O_RDONLY);if (fd < 0) {perror("open");return 1;}struct aiocb my_aiocb;memset(&my_aiocb, 0, sizeof(struct aiocb));my_aiocb.aio_fildes = fd;my_aiocb.aio_buf = malloc(1024);my_aiocb.aio_nbytes = 1024;my_aiocb.aio_offset = 0;my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD;my_aiocb.aaiocb.sigev_notify_function = aio_completion_handler;my_aiocb.aio_sigevent.sigev_notify_attributes = NULL;my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;if (aio_read(&my_aiocb) < 0) {perror("aio_read");close(fd);return 1;}// 进程可做其他事情sleep(1);return 0;
}
- 解释:上述代码使用`aio_read`进行异步读操作。首先打开文件,设置`aiocb`结构(包含文件描述符、缓冲区、字节数等),并设置信号通知方式和处理函数。调用`aio_read`后,进程可以继续做其他事情,当读操作完成,会调用`aio_completion_handler`处理结果。
  • 重要性:异步IO是真正非阻塞的,对高并发网络服务器实现至关重要。

六、信号驱动IO(signal driven I/O, SIGIO)

  • 特点
    • 允许套接口进行信号驱动I/O并安装信号处理函数,进程继续运行不阻塞。
    • 当数据准备好,进程收到SIGIO信号,可在信号处理函数中调用I/O操作函数处理数据。
    • 优势在于等待数据报到达期间,进程可继续执行,避免了select的阻塞与轮询。

七、服务器模型Reactor与Proactor

  • Reactor模型
    • 是一种事件驱动机制,用于同步I/O。
    • 应用程序将处理I/O事件的接口注册到Reactor上,若相应事件发生,Reactor调用注册的接口(回调函数)。
    • 三个重要组件:
      1. 多路复用器:如selectpollepoll等系统调用。
      2. 事件分发器:将多路复用器返回的就绪事件分到对应的处理函数。
      3. 事件处理器:负责处理特定事件的处理函数。
    • 具体流程:
      1. 注册读就绪事件和相应事件处理器。
      2. 事件分离器等待事件。
      3. 事件到来,激活分离器,分离器调用事件对应的处理器。
      4. 事件处理器完成实际的读操作,处理数据,注册新事件,返还控制权。
    • 优点:响应快,编程相对简单,可扩展性和可复用性好。
    • 缺点:当程序需要使用多核资源时会有局限,因为通常是单线程的。
    • 代码示例:
#include <iostream>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>class EventHandler {
public:virtual void handleEvent(int fd) = 0;
};class Reactor {
private:int epollFd;std::vector<EventHandler*> handlers;
public:Reactor() {epollFd = epoll_create1(0);}~Reactor() {close(epollFd);}void registerHandler(int fd, EventHandler* handler) {struct epoll_event event;event.data.fd = fd;event.events = EPOLLIN;epoll_ctl(epollFd, EPOLL_CTL_ADD, fd, &event);handlers.push_back(handler);}void handleEvents() {struct epoll_event events[10];int numEvents = epoll_wait(epollFd, events, 10, -1);for (int i = 0; i < numEvents; i++) {int fd = events[i].data.fd;for (EventHandler* handler : handlers) {handler->handleEvent(fd);}}}
};class EchoHandler : public EventHandler {
public:void handleEvent(int fd) override {char buffer[1024];int bytesRead = recv(fd, buffer, sizeof(buffer), 0);if (bytesRead > 0) {send(fd, buffer, bytesRead, 0);}}
};int main() {Reactor reactor;int serverSocket = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8080);serverAddr.sin_addr.s_addr = INADDR_ANY;bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));listen(serverSocket, 5);EchoHandler handler;reactor.registerHandler(serverSocket, &handler);while (1) {reactor.handleEvents();}return 0;
}
- 解释:上述C++代码中,`Reactor`类负责创建`epoll`,注册和处理事件。`EventHandler`是抽象基类,`EchoHandler`是具体处理接收和发送的派生类。`main`函数创建服务器socket,注册`EchoHandler`到`Reactor`,并不断调用`handleEvents`处理事件。
  • Proactor模型
    • 最大特点是使用异步I/O,所有I/O操作都交由系统的异步I/O接口执行,工作线程只负责业务逻辑。
    • 具体流程:
      1. 处理器发起异步操作并关注I/O完成事件。
      2. 事件分离器等待操作完成事件。
      3. 分离器等待时,内核并行执行实际I/O操作并将结果存入用户缓冲区,通知分离器读操作完成。
      4. I/O完成后,通过事件分离器呼唤处理器。
      5. 事件处理器处理用户缓冲区中的数据。
    • 增加了编程复杂度,但给工作线程带来更高效率,可利用系统态的读写优化。
    • 在Windows上常用IOCP支持高并发,Linux上因aio性能不佳,主要以Reactor模型为主。
    • 也可使用Reactor模拟Proactor,但在读写并行能力上会有区别。

八、同步I/O和异步I/O的区别总结

  • 阻塞与非阻塞IO的区别
    • 调用阻塞IO会阻塞进程直到操作完成,非阻塞IO在kernel准备数据时会立刻返回。
  • 同步与异步IO的区别
    • 同步IO在做“IO operation”(如read系统调用)时会阻塞进程。阻塞IO、非阻塞IO、多路复用IO都属于同步IO。
    • 非阻塞IO在数据准备好时的拷贝数据阶段会阻塞进程;而异步IO在整个过程中,进程不会被阻塞,进程发起IO操作后直接做其他事,直到kernel发送信号通知完成。

相关文章:

网络IO与IO多路复用

一、网络IO基础 系统对象&#xff1a; 网络IO涉及用户空间调用IO的进程或线程以及内核空间的内核系统。例如&#xff0c;当进行read操作时&#xff0c;会经历两个阶段&#xff1a; 等待数据准备就绪。将数据从内核拷贝到进程或线程中。 多种网络IO模型的出现原因&#xff1a;…...

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…...

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…...

Android SystemUI——StatusBar视图创建(六)

上一篇文章我们介绍了 StatusBar 的构建过程,在 makeStatusBarView() 中获得 FragmentHostManager,用来管理 StatusBar 的窗口。 一、状态栏视图 在得到 FragmentHostManager 实例对象之后,还会继续调用 addTagListener() 方法设置监听对象,然后获取 FragmentManager 并开…...

解决 Error: Invalid or corrupt jarfile day04_studentManager.jar 报错问题

在 Java 开发过程中&#xff0c;我们可能会遇到这样的报错信息&#xff1a;Error: Invalid or corrupt jarfile day04_studentManager.jar。这个错误通常表示 day04_studentManager.jar 文件可能已损坏或无效&#xff0c;下面将为大家详细介绍如何解决这个问题。 一、错误点分…...

《MambaIR:一种基于状态空间模型的简单图像修复基线方法》学习笔记

paper&#xff1a;2402.15648 目录 摘要 一、引言 1、模型性能的提升依赖于网络感受野的扩大&#xff1a; 2、全局感受野和高效计算之间存在固有矛盾&#xff1a; 3、改进版 Mamba的巨大潜力 4、Mamba 在图像修复任务中仍面临以下挑战&#xff1a; 5、方法 6、主要贡献…...

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天&#xff0c;开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日&#xff0c;OpenAtom OpenHarmony&#xff08;开放原子开源鸿蒙&#xff0c;以下简称“OpenHarmony”或“开源鸿蒙”&#xff09;社区2024年度工作会议于深圳盛大启…...

2024年我的技术成长之路

2024年我的技术成长之路 大家好&#xff0c;我是小寒。又到年底了&#xff0c;一年过得真快啊&#xff01;趁着这次活动的机会&#xff0c;和大家聊聊我这一年在技术上的收获和踩过的坑。 说实话&#xff0c;今年工作特别忙&#xff0c;写博客的时间比去年少了不少。不过还是…...

最长递增子序列问题(Longest Increasing Subsequence),动态规划法解决,贪心算法 + 二分查找优化

问题描述&#xff1a;在一个大小乱序的数列中&#xff0c;找到一个最大长度的递增子序列&#xff0c;子序列中的数据在原始数列中的相对位置保持不变&#xff0c;可以不连续&#xff0c;但必须递增。 输入描述&#xff1a; 第一行输入数列的长度 n。(1 < n < 200) 第二…...

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…...

基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day2

为了使 2048 游戏的设计更加美观和用户友好&#xff0c;我们可以进行以下几项优化&#xff1a; 改善颜色方案&#xff1a;使用更温馨的颜色组合。添加动画效果&#xff1a;为方块的移动和合并添加渐变效果。优化分数显示&#xff1a;在分数增加时使用动画效果。 以下是改进后…...

服务化架构 IM 系统之应用 MQ

在微服务化系统中&#xff0c;存在三个最核心的组件&#xff0c;分别是 RPC、注册中心和MQ。 在前面的两篇文章&#xff08;见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》&#xff09;中&#xff0c;我们站在应用的视角分析了普适性的 RPC 和 注…...

IoTDB 常见问题 QA 第四期

关于 IoTDB 的 Q & A IoTDB Q&A 第四期来啦&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;Java 中如何使用 SSL 连接 IoTDB 问题…...

Objective-C语言的数据类型

Objective-C数据类型详解 Objective-C是一种面向对象的编程语言&#xff0c;主要用于macOS和iOS应用程序的开发。作为C语言的超集&#xff0c;Objective-C继承了C语言的基本数据类型&#xff0c;同时也引入了一些独特的特性。本文将对Objective-C的各种数据类型进行详细的介绍…...

3d系统误差分析

系统标定重投影误差预估 在计算机视觉和三维重建领域中&#xff0c;评估一个相机系统标定精度的重要指标。通过比较真实的三维点在图像中的投影位置与标定模型计算出的投影位置之间的差异&#xff0c;来衡量标定的准确性。 以下是对这一概念的详细解析&#xff1a; 什么是系统…...

单片机的原理及其应用:从入门到进阶的全方位指南

以下是一篇详细、深入的“单片机的原理及其应用”博客文章示例&#xff0c;适合想要系统学习或深入了解单片机的读者。文中不仅会介绍单片机的基本原理、内部构造、开发流程和应用领域&#xff0c;还会融入更多的理论分析、实操案例以及常见问题与解决思路等&#xff0c;帮助读…...

在.NET用C#将Word文档转换为HTML格式

将Word文档转换为HTML格式尤其具有显著的优势&#xff0c;它不仅能够确保文档内容在多种设备和平台上保持一致灵活的显示&#xff0c;还便于通过网络进行传播和集成到各种Web应用中。随着越来越多的企业和开发者寻求更灵活、更具兼容性的文件处理方式&#xff0c;.NET框架下的C…...

智能学习平台系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智能学习平台系统软件来发挥其高效地信息处理的作用&#…...

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时&#xff0c;是在地址:端口/Controller名称进行访问的&#xff0c;这个时候Controller的默认路由配置如下 访问接口时&#xff0c;是通过请求方法&#xff08;GET、Post、Put、Delete&#xff09;进行接口区分的&…...

探索与创作:2024年CSDN平台上的成长与突破

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN&#xff1a;编程新手的避风港初学者的福音&#xff1a;细致入微的知识讲解考试复习神器&#xff1a;技术总结的“救命指南”曾经的自己&#xff1a;为何迟迟不迈出写博客的第一步兴趣萌芽&#xff1a;从“读”到“想写”的初体验…...

[Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明

登录Qualcomm CreatePoing Qualcomm CreatePointhttps://createpoint.qti.qua...

【python_钉钉群发图片】

需求&#xff1a; **在钉钉群发图片&#xff0c;需要以图片的形式展示&#xff0c;如图所示&#xff1a;**但是目前影刀里面没有符合条件的指令 解决方法&#xff1a; 1、在钉钉开发者后台新建一个自建应用&#xff0c;发版&#xff0c;然后获取里面的appkey和appsecret&am…...

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事&#xff1a;让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…...

ElasticSearch下

DSL查询 叶子查询&#xff1a;在特定字段里查询特定值&#xff0c;属于简单查询&#xff0c;很少单独使用复合查询&#xff1a;以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理&#xff1a; 排序&#xff1a;按照1个或多个字段做排序分页…...

T-SQL语言的数据库交互

T-SQL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库在各个行业中扮演着越来越重要的角色。数据库的有效管理和优化对于企业的数据安全、效率提升和决策支持至关重要。T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server的重要扩展语言&#xf…...

.Net 6.0 .Net7.0 .Net8.0 .Net9.0 使用 Serilog 按日志等级写入日志及 appsetting.json 配置方式实现

前言 最近使用最新版的Serilog记录日志时&#xff0c;发现以前有些关于Serilog的Nuget弃用了&#xff0c;最关键的是有些配置写法也改变&#xff0c;于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用 说明&#xff1a;我是用的.Net6&#xff0c;最新长期支持…...

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…...

从零开始:Gitee 仓库创建与 Git 配置指南

引言 Git 是一款广泛使用的版本控制工具&#xff0c;它能够帮助开发者在开发过程中高效地管理代码的版本。而 Gitee&#xff08;码云&#xff09;是国内知名的 Git 托管平台&#xff0c;它提供了强大的代码托管、团队协作和项目管理功能。如果你是 Git 和 Gitee 的新手&#x…...

大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

1、项目背景&#xff1a;针对大文件上传&#xff0c;如果将文件作为一个请求去发送给后端&#xff0c;会有以下几种问题&#xff0c;首先是上传时间长&#xff0c;用户不能进行其他操作&#xff0c;包括页面刷新等操作&#xff0c;其次有的接口会设置响应时间限制&#xff0c;可…...

如何在日常工作中使用AI

### 如何在日常工作中使用AI&#xff1a;提高效率与创造力 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;它已经成为我们日常工作的重要助手。无论是在准备演示文稿、进行知识搜索还是寻求技术支持方面&#xff0c;AI都能够提供有力的支持。本文将探讨如何…...

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程&#xff0c;它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信&#xff0c;本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信&#xff0c;需要借助网络协议栈中的各层协议&#x…...

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…...

2024年度推进可解释人工智能迈向类人智能讨论总结分享

目录 一、探索“可解释人工智能”&#xff1a;AI如何从“黑箱”走向“透明大师” 二、走进可解释人工智能&#xff1a;让AI的决策变得透明 &#xff08;一&#xff09;几种常见的特征导向方法 &#xff08;二&#xff09;像素级方法 1. 层次相关传播&#xff08;LRP&#…...

【Unity】使用Canvas Group改变UI的透明度

目录 一、前言二、Canvas Group三、结合DOTween达到画面淡进的效果 一、前言 在平时开发中&#xff0c;可以通过控制材质、Color改变UI透明度&#xff0c;除此之外还可以CanvasGroup组件来控制透明度。 二、Canvas Group 官方文档链接&#x1f449;&#x1f449; 点击进入 …...

【北京迅为】iTOP-4412全能版使用手册-第八十七章 安装Android Studio

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

小例Java结合Spring框架和MyBatis ORM来实现 ERP项目中实现读写分离

前记&#xff1a;大家带着挑剔的眼光&#xff0c;多多批判和指正&#xff01;&#x1f64f; 在ERP项目中实现读写分离&#xff0c;我们可以使用Java结合Spring框架和MyBatis ORM来实现。以下是一个简化的例子&#xff0c;展示了如何在ERP项目中配置和使用读写分离。 一、项目…...

.gitignore配置忽略out目录

文章目录 说明操作 说明 可以结合IDEA可视化操作git&#xff0c;只要不删除远程仓库&#xff0c;如果本地操作项目出现错误&#xff0c;可以直接修改远程仓库的.gitignore文件&#xff0c;并重新拉取项目到本地。 操作 在项目根目录下找到 .gitignore 文件&#xff0c;打开并…...

mac 安装mongodb

本文分享2种mac本地安装mongodb的方法&#xff0c;一种是通过homebrew安装&#xff0c;一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…...

向harbor中上传镜像(向harbor上传image)

向 Harbor 中上传镜像通常分为以下几个步骤&#xff1a; 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先&#xff0c;确保你已经能够访问 Harbor&#xff0c;并且已经注册了账户。如果还没有 Harbor 账户&#xff0c;你需要先注册一…...

项目太大导致 git clone 失败

git克隆也分深浅&#xff0c;大项目clone可以先用浅克隆&#xff0c;只克隆源代码和最新的提交记录。 具体分两步&#xff1a; 1. 浅克隆 git clone https://github.com/google/mydemo.git --depth 1 只会克隆最新的一次提交&#xff0c;没有历史记录&#xff0c; 2. 拉取剩…...

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器&#xff0c;集成了先进的 AI 技术&#xff0c;旨在提升编程效率。以下是其主要特点和功能&a…...

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊&#xff0c;大佬们。我们的python基础内容的这一篇终于写好了&#xff0c;啪唧啪唧啪唧…… 说实话&#xff0c;这一篇确实写了很久&#xff0c;一方面是在忙其他几个专栏的内容&#xff0c;再加上生活学业上的事儿&#xff0c;确实精力有限&#xff0c;另一方面&…...

MySQL触发器:概念、作用

MySQL触发器&#xff1a;概念、作用与问题解决 在MySQL数据库管理系统中&#xff0c;触发器是一项强大且实用的功能。它为数据库的操作提供了一种自动化响应机制&#xff0c;在许多场景下极大地提升了数据管理的效率和数据的完整性。本文将深入探讨MySQL触发器是什么&#xff…...

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中&#xff0c;基于 Cookie 的身份鉴权是一种常见的身份验证方式&#xff0c;特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据&#xff0c;从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数

目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …...

麒麟操作系统服务架构保姆级教程(十二)keepalived高可用

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 随着业务的扩大&#xff0c;服务器集群也越来越大&#xff0c;用户多了起来就要保证用户访问&#xff0c;服务绝对不能宕机&#xff0c;那么这个时候咱们除了做灾备以外&#xff0c;负载均衡服务器会…...

docker 部署confluence

1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042 4.编写do…...

【English-Book】Go in Action目录页翻译中文

第8页 内容 前言 xi 序言 xiii 致谢 xiv 关于本书 xvi 关于封面插图 xix 1 介绍 Go 1 1.1 用 Go 解决现代编程挑战 2 开发速度 3 • 并发 3 • Go 的类型系统 5 内存管理 7 1.2 你好&#xff0c;Go 7 介绍 Go 玩具 8 1.3 总结 8 2 Go 快速入门 9 2.1 程序架构 10 2.2 主包 …...

奉加微PHY6230兼容性:部分手机不兼容

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...