Nginx相关知识

目录

一.HTTP请求数据在服务器中的传输与处理详解

1.2 套字节 

1.3 零拷贝技术 

二.I/O模型 

2.1 I/O模型简介

2.2 常见的I/O模型及其特点

1.同步/异步

2.阻塞vs 非阻塞

3. 同步/异步与阻塞/非阻塞的关系

4.多路复用I/O模型

5.异步I/O模型

三.Nginx模块

3.1 概述nginx

3.2 nginx配置文件 

3.2.1 Nginx的配置文件的组成部分

3.2.2 主配置文件 (nginx.conf)核心结构

3.2.3 子配置文件 (conf.d/*.conf)

3.2.4 两者的关系

四.Nginx的安装

4.1 yum安装

4.2 编译安装

4.3 nginx开机自启

五.Nginx相关命令

5.1 nginx常见命令

5.2 Nginx的信号

六. Nginx运维三部曲:日志分割、无缝升级与版本回滚实战 

6.1 分割日志

6.2 升级nginx

6.2.1升级思路

6.2.2 平滑升级nginx 

6.3 回滚(退回旧版本)


一.HTTP请求数据在服务器中的传输与处理详解

1. 客户端发送数据

  • 客户端(如浏览器)通过HTTP请求向服务器发送数据。

  • 数据被打包成TCP/IP协议的数据包,通过网络传输到服务器的网卡。


2. 网卡接收数据

  • 服务器的网卡接收到客户端发送的数据包。

  • 网卡通过DMA(Direct Memory Access,直接内存访问)技术,将数据包直接写入内核空间的内存缓冲区,而不需要CPU的干预。


3. 数据进入内核空间

  • 数据包被写入内核空间的接收缓冲区(Receive Buffer)

  • 内核的网络协议栈(如TCP/IP协议栈)对数据包进行解析,包括:

    • 检查数据包的完整性(如校验和)。

    • 解析IP头和TCP头,确定数据包的目标端口和应用程序。


4. 数据从内核空间到用户空间

  • 内核将解析后的数据从接收缓冲区复制到用户空间的应用程序缓冲区(Application Buffer)

  • 这个过程通常通过系统调用(如readrecv)完成。


5. 应用程序处理数据

  • 应用程序(如Nginx)从用户空间的缓冲区中读取数据。

  • 应用程序根据业务逻辑处理数据,例如:

    • 解析HTTP请求。

    • 生成HTTP响应。

    • 将响应数据写入用户空间的发送缓冲区。


6. 数据从用户空间到内核空间

  • 应用程序通过系统调用(如writesend)将响应数据从用户空间的发送缓冲区复制到内核空间的发送缓冲区(Send Buffer)


7. 数据从内核空间到网卡

  • 内核的网络协议栈将发送缓冲区的数据打包成TCP/IP协议的数据包。

  • 内核通过DMA技术将数据包从发送缓冲区直接传输到网卡。


8. 网卡发送数据

  • 网卡将数据包发送到网络中,传输回客户端。

1.2 套字节 

套接字(Socket)是网络编程中的一种抽象概念,用于实现不同主机之间的通信。通过套接字,应用程序可以在网络上进行数据传输,支持 TCP、UDP 等多种协议。

套字节的组成

IP 地址和端口号

  • IP 地址用于标识网络中的主机。
  • 端口号用于标识主机上的具体应用程序

1.3 零拷贝技术 

"HTTP请求数据在服务器中的传输与处理"的过程可以看出在传统的 I/O 操作中,数据通常需要在用户空间和内核空间之间多次复制,而零拷贝(Zero-Copy)旨在减少数据在内存中的复制次数,从而提高数据传输的效率。

零拷贝技术的工作原理

零拷贝技术通过以下方式避免数据在内存中的多次复制:

  1. 直接内存访问(DMA)
    • 使用 DMA 技术,数据可以直接从磁盘读取到内核缓冲区,无需 CPU 参与。
  2. 内存映射(mmap)
    • 将内核缓冲区映射到用户空间,用户程序可以直接访问内核缓冲区,无需将数据复制到用户空间。
  3. sendfile 系统调用
    • 在 Linux 中,sendfile 系统调用可以直接将数据从文件描述符传输到网络套接字,无需经过用户空间

二.I/O模型 

2.1 I/O模型简介

I/O模型(Input/Output Model)是计算机系统中用于处理输入输出操作的一种机制,它决定了程序如何与外部设备(如磁盘、网络、键盘等)进行数据交互。不同的I/O模型对程序的性能、并发能力和资源消耗有重要影响。

2.2 常见的I/O模型及其特点

1.同步/异步

程序执行流程是否需要等待操作完成。

同步:程序发起一个操作后,必须等待该操作完成才能继续执行后续代码。

异步:程序发起一个操作后,不需要等待操作完成,可以继续执行其他任务。操作完成后,系统会通知程序进行处理。

2.阻塞vs 非阻塞

线程是否会被挂起等待操作完成。

阻塞:当程序发起一个操作时,如果操作不能立即完成,线程会被挂起,直到操作完成。

非阻塞:当程序发起一个操作时,如果操作不能立即完成,会立即返回一个错误或状态,线程可以继续执行其他任务。

3. 同步/异步与阻塞/非阻塞的关系

  1. 同步阻塞:程序发起操作后,必须等待操作完成,线程会被挂起。

  2. 同步非阻塞:程序发起操作后,如果操作不能立即完成,会立即返回,程序需要轮询检查操作状态。

  3. 异步阻塞:这种组合在实际中很少见,因为异步操作通常是非阻塞的。

  4. 异步非阻塞:程序发起操作后,不需要等待操作完成,可以继续执行其他任务。操作完成后,系统会通知程序进行处理。

4.多路复用I/O模型

特点:单线程监控多个I/O操作:使用一个线程同时监控多个文件描述符(如Socket),当某个文件描述符就绪时,通知程序进行处理。

优点:高效处理大量并发连接,减少线程数量,节省资源。

缺点:不同操作系统的实现方式不同(如epoll仅适用于Linux)。

常见的多路复用I/O模型有:

  1. select
    • 支持的文件描述符数量有限(通常为1024),效率较低。
    • 需要遍历所有文件描述符来找到准备就绪的 I/O 操作,时间复杂度为O(n)。
  2. poll
    • 解决了select的文件描述符数量限制,但效率仍然不高。
    • 同样需要遍历所有文件描述符,时间复杂度为O(n)。
  3. epoll(Linux特有)
    • 高效支持大量文件描述符,时间复杂度为O(1)。
    • 使用事件通知机制,只处理就绪的文件描述符。

5.异步I/O模型

特点

  1. 完全非阻塞
    • 程序发起I/O操作后,不需要等待操作完成,可以继续执行其他任务。
  2. 事件通知
    • I/O操作完成后,系统会通过回调函数或信号通知程序进行处理。
  3. 高效利用资源
    • 避免了线程阻塞,能够充分利用CPU和内存资源

三.Nginx模块

3.1 概述nginx

NGINX(发音为“engine-x”)是一个高性能的 Web服务器反向代理服务器 和 负载均衡器

主要功能包括: 

静态内容服务

  • 高效处理HTML、CSS、JS、图片等静态文件

  • 支持sendfile零拷贝技术,大幅提升文件传输效率

动态内容处理:通过FastCGI支持PHP、Python等动态语言

负载均衡:支持HTTP、TCP/UDP负载均衡

 补充:在Nginx中,支持HTTP负载均衡TCP/UDP负载均衡分别对应应用层(L7)和传输层(L4)的流量分发能力,两者的核心区别在于协议栈层级和功能特性。 

nginx的基础特性包括:

  • 模块化设计,较好的扩展性

  • 高可靠性

  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件

  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存

  • event-driven, aio, mmap,sendfile


3.2 nginx配置文件 

3.2.1 Nginx的配置文件的组成部分

主配置文件:nginx.conf

子配置文件: include conf.d/*.conf

3.2.2 主配置文件 (nginx.conf)核心结构

# 全局上下文 (Main Context)
user  nginx;
worker_processes  auto;# 事件驱动配置 (Events Context)
events {worker_connections  1024;
}# HTTP核心配置 (HTTP Context)
http {include       /etc/nginx/mime.types;default_type  application/octet-stream;# 包含子配置文件include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}# 流代理配置 (Stream Context)
stream {include /etc/nginx/stream.d/*.conf;
}

3.2.3 子配置文件 (conf.d/*.conf)

子配置文件一般在主配置文件的http部分

http块中可以包含多个子配置文件,常见的子配置文件

  • HTTP 块 是 Nginx 配置的核心部分,包含 server 块、location 块、upstream 块等。
  • Server 块 定义虚拟主机,包含 location 块。
  • Location 块 定义 URL 路径的处理规则。
  • Upstream 块 定义负载均衡的后端服务器组。
  • Include 指令 用于引入子配置文件,实现配置文件的模块化。

3.2.4 两者的关系

Nginx 的主配置文件(nginx.conf)和子配置文件(如 conf.d/*.conf)之间是 分层包含关系,通过模块化设计实现配置的灵活管理。 


四.Nginx的安装

4.1 yum安装

1.配置好基础仓库后# 2. 安装EPEL仓库
yum install -y epel-release# 3. 安装nginx
yum install -y nginx# 4. 启动nginx
systemctl start nginx

4.2 编译安装

准备工作

#安装依赖包
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel
#新建nginx用户便于管理
useradd -M -s /sbin/nologin nginx
#官网下载包
wget http://nginx.org/download/nginx-1.18.0.tar.gz

开始编译

tar xf nginx-1.18.0.tar.gz 
mkdir /apps/nginx -p
cd nginx-1.18.0/                           #解压源码包./configure --prefix=/apps/nginx \         #配置编译选项
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
#输入完成后点击回车键make -j2 && make install                    #编译并安装chown -R nginx.nginx /apps/nginx            #加权限ln -s /apps/nginx/sbin/nginx /usr/sbin/     #直接启动 不需要绝对路径ll /apps/nginx/         #检查该路径下是否存在安装的文件ls -l /apps/nginx/sbin/nginx       #如果有 nginx 可执行文件,说明编译成功。/apps/nginx/sbin/nginx -v         #如果返回类似 nginx version: nginx/1.18.0,说明安装成功。/apps/nginx/sbin/nginx             #启动 Nginxps -ef | grep nginx                #如果看到 master 和 worker 进程,说明 Nginx 已运行。

  

 

4.3 nginx开机自启

创建nginx自启文件 

vim /usr/lib/systemd/system/nginx.service
#建立文件#修改文件内容
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID[Install]
WantedBy=multi-user.target

 重新加载文件,启动

systemctl daemon-reload 
#重新加载配置
systemctl enable --now nginx
#开机自启并立即启动    如果logs下有nginx.pid文件那会启动失败,只需删除logs下的nginx.pid即可。chown -R nginx.nginx /apps/nginx
#修改权限
systemctl is-enabled nginx#如果输出 enabled,表示 Nginx 已成功设置为开机自启

 


补充:之后的学习中,会遇到在一台服务器上运行多个 Nginx 实例的情况为避免 PID 冲突,所有实例都会尝试使用同一个 pid 文件路径。

###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid   /apps/nginx/run/nginx.pid;
#找到 pid的位置修改  

五.Nginx相关命令

5.1 nginx常见命令

#基本格式
nginx [选项] [参数]
选项功能描述
-c <配置文件>指定自定义的配置文件路径。
-t测试配置文件语法是否正确。
-T测试配置文件并打印解析后的配置内容。
-q在测试配置文件时以静默模式运行,只输出关键信息。
-g <全局配置>在命令行中指定全局配置选项。
-e <错误日志文件>设置错误日志文件的路径。
-s <信号>向 Nginx 发送信号(如 stopreload)。
-s <文件>启动 Nginx 并将 master 进程的 PID 写入指定文件。
-p <工作目录>设置工作目录,用于存放日志文件和临时文件。
-V显示 Nginx 的版本、编译信息和配置参数。
-h显示帮助信息,包括所有可用的命令行选项。
-q <文件>在测试配置文件时,将输出结果写入指定文件

5.2 Nginx的信号

Nginx 的信号(Signals)是用于控制 Nginx 进程行为的机制。通过向 Nginx 的 master 进程发送不同的信号,可以实现停止、重启、重新加载配置等操作。

#基本格式
nginx  -s 信号
信号功能描述使用方式
stop立即停止 Nginx 进程。nginx -s stop 或 kill -TERM <pid>
quit优雅地停止 Nginx 进程。nginx -s quit 或 kill -QUIT <pid>
reload重新加载配置文件。nginx -s reload 或 kill -HUP <pid>
reopen重新打开日志文件。nginx -s reopen 或 kill -USR1 <pid>
USR2热升级 Nginx 可执行文件。kill -USR2 <pid>
WINCH优雅地关闭旧的 worker 进程(热升级后使用)。kill -WINCH <pid>
TERM/INT立即停止 Nginx 进程。kill -TERM <pid> 或 kill -INT <pid>
HUP重新加载配置文件。kill -HUP <pid>

六. Nginx运维三部曲:日志分割、无缝升级与版本回滚实战 

6.1 分割日志

为什么需要分割日志?

  • 文件过大:单个日志文件过大可能导致磁盘空间不足或日志分析工具无法处理。

  • 归档管理:按时间或大小分割日志,便于归档、备份和清理。

  • 性能优化:避免日志文件过大影响 Nginx 的性能。

cd /apps/nginx/logs# 1. 备份旧日志(保留原权限)
mv --backup=numbered --preserve=all access.log access.log.bak# 2. 创建新日志并设置正确权限
touch access.log
chown nginx:nginx access.log access.log.bak error.log  # 同时修正所有日志权限
chmod 644 access.log access.log.bak error.log# 3. 通知 Nginx 重新打开日志
nginx -s reopen 2>/dev/null || kill -USR1 $(cat nginx.pid 2>/dev/null)# 4. 验证结果
ls -lh access.log* error.log*

6.2 升级nginx

6.2.1升级思路

  1. 将旧Nginx文件换成新Nginx文件(注意备份)

  2. 向master进程发送USR2信号

  3. master进程修改pid文件名,加后缀.oldbin

  4. master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务

  5. 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件

  6. 向旧master进程发送QUIT信号,关闭老master

  7. 如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT

6.2.2 平滑升级nginx 

 Nginx 的平滑升级是指在不停机的情况下,将 Nginx 从旧版本升级到新版本。这样可以确保服务不中断,用户体验不受影响。

从nginx1.18升级到nginx1.20

#关闭防火墙
systemctl stop firewalld 
setenforce 0
#启动服务
systemctl start nginx
#下载安装包到src目录
wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/cd /usr/local/src/;ls

 

tar xf nginx-1.20.2.tar.gz 
cd nginx-1.20.2/;ls

重新编译安装#检测编译环境 加模块
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module#不要make install
make

mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名
cp /usr/local/src/nginx-1.20.2/objs/nginx /apps/nginx/sbin
#将新版本 拷入进去
/apps/nginx/sbin/nginx -t
#语法检查

kill -USR2 `cat /apps/nginx/logs/nginx.pid`ps auxf|grep nginx
#会生成新的master进程,需要结束旧的

cat /apps/nginx/los/nginx.pid #1.20.2版本的cat /apps/nginx/los/nginx.pid.oldbin  #1.18版本的kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
#优雅关闭 旧版本的master processpstree -p |grep nginxcurl -I http://localhost
#检查新版本是否实际生效,输出中应包含 Server: nginx/1.20.2。ps -ef | grep nginx | grep -v grep     #验证旧 worker 已完全退出tail -n 20 /apps/nginx/logs/error.log
#检查错误日志,确保没有 bind() failed 或其他端口冲突错误。kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`
#如果确认新版本运行正常,可以安全关闭旧 master

6.3 回滚(退回旧版本)

回滚的本质是 重新激活旧 Master 的 Worker,并关闭新 Master。

所以必须满足以下条件才能回滚:

  1. 旧 Master 进程仍在运行

  2. 旧 Worker 已停止(通过 kill -WINCH

  3. 未执行 kill -QUIT 旧PID(否则旧 Master 会退出

#唤起旧版本的主进程
kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`#结束新版本的master进程
kill -QUIT `cat /apps/nginx/logs/nginx.pid`curl -I 127.1 
#通过 curl 发送一个 HEAD 请求到本地服务器并返回响应头信息

若旧 Master 已退出

解决方案:手动启动旧二进制文件

# 1. 关闭新版本
kill -TERM `cat /apps/nginx/logs/nginx.pid`# 2. 启动旧版本
cp /apps/nginx/sbin/nginx.bak /apps/nginx/sbin/nginx
/apps/nginx/sbin/nginx -t && /apps/nginx/sbin/nginx

若旧 Worker 未完全关闭 

# 强制杀死残留 Worker
pkill -9 -f "nginx: worker process"
# 再执行标准回滚流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告

数字经济浪潮奔涌向前&#xff0c;Web3.0发展方兴未艾&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;通过将分布式账本技术与身份治理相融合&#xff0c;在Web3.0时代多方协作的分布式应用场景中发挥核心作用&#xff0c;是构建…

ES6入门---第三单元 模块四:Set和WeakSet

set数据结构: 类似数组&#xff0c;但是里面不能有重复值&#xff0c;如果有&#xff0c;只显示一个 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一项 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 删除一项 setArr.ha…

Cognito

首先Cognito没有提供登录至AWS控制台的功能&#xff0c;然而您可以通过Cognito Identity Pool获取到IAM role的credentials [1]&#xff0c;再另外通过代码自行将IAM role credentials拼凑成AWS控制台登录的URL [2]。 最后&#xff0c;由于Cognito的使用除了User Pool以及Iden…

EfficientNet 改进:与Transformer结合的图像分类模型

1.介绍 在计算机视觉领域,EfficientNet因其高效的网络架构设计而广受欢迎。 本文将深入分析一个结合EfficientNet主干和Transformer分类头的创新模型实现。 模型概述 这个实现将EfficientNet的高效特征提取能力与Transformer的强大序列建模能力相结合,主要包含以下几个核心…

复杂网络系列:第 5 部分 — 社区检测和子图

关键词&#xff1a;Community Detection Algorithms 一、说明 在本教程中&#xff0c;我们将探讨网络分析的两个基本方面&#xff1a;社区检测和使用子图。了解这些概念将使您能够发现复杂网络中隐藏的结构和关系。 二、何为社区&#xff0c;何为社区检测&#xff1f; 2.1 …

【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线

需求说明 督导检查&#xff0c;各条线都要收集资料。 今天去加班&#xff0c;遇到家教主任&#xff0c;她让我用保教主任的彩色打印机打印这套活跃度表格。&#xff08;2023学年上学期下学期-2024学年上学期&#xff0c;就是202309-202504&#xff09; 每个excle都是内容在A4一…

升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测

#工作记录 在 NVIDIA 发布 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后&#xff0c;开发者纷纷选择升级以获取新特性和性能提升。 CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布&#xff0c;带来全新特性与优化-CSDN博客 然而&#xff0c;升级完成并不意味着大功告成&#xff0c;确认升级后…

LLM论文笔记 28: Universal length generalization with Turing Programs

Arxiv日期&#xff1a;2024.10.4机构&#xff1a;Harvard University 关键词 图灵机 CoT 长度泛化 核心结论 Turing Programs 的提出 提出 Turing Programs&#xff0c;一种基于图灵机计算步骤的通用 CoT 策略。通过将算法任务分解为逐步的“磁带更新”&#xff08;类似图灵…

【全队项目】智能学术海报生成系统PosterGenius--图片布局生成模型LayoutPrompt(1)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;大模型实战训练营_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

位图的实现和拓展

一&#xff1a;位图的介绍 ①&#xff1a;需要位图的场景 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f; 要判断一个数是否在某一堆数中&#xff0c;我们可能会想到如下方法&#xff1a; A…

排序功法入门指南【江湖算法笔记】

话说江湖风云变幻&#xff0c;各路英雄好汉行走江湖&#xff0c;总得有个名号排行。若问“东邪西毒南帝北丐”谁强谁弱&#xff0c;总得排个座次不是&#xff1f;这排序之道&#xff0c;恰似武功秘籍&#xff0c;练好了能号令群雄&#xff0c;练岔了怕是要被笑掉大牙&#xff0…

【中间件】brpc_基础_用户态线程中断

bthread之用户态线程中断 源码 1 简介 interrupt_pthread 核心功能是 通过信号机制中断阻塞的 pthread 线程&#xff0c;以实现线程的协作式中断。 2 核心功能与设计 2.1 信号选择与注册 信号选择&#xff1a;使用 SIGURG 作为中断信号。 原因&#xff1a;SIGURG 通常用于…

Linux 的网络卡

#本机操作系统CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 网卡能不能被捉到可以使用【dmesg|grep xx】来判断&#xff0c;有没有驱动则可以使用lsmod看看模块有没有加载核心&#xff01;最后&#xff0c;以ifconfig xxx测试看看 观察核心所捉到的网卡…

前端双工通信的几种方案详细描述

前端实现双工通信&#xff08;全双工或半双工&#xff09;的常见方案及详细实现如下&#xff1a; 一、WebSocket&#xff08;全双工&#xff09; 原理&#xff1a;基于 TCP 的持久化协议&#xff0c;客户端与服务端建立双向通信通道&#xff0c;支持实时双向数据传输。 // 客…

KUKA机器人快速启动设置

KUKA机器人在首次开机启动时&#xff0c;有时在示教器上需要进行投入运行等相关的设置。如以下相关的信息需要处理&#xff1a; 1、机器人系统开机后&#xff0c;选择T1运行模式&#xff1b;2、显示提示信息&#xff1a;“RDC 存储器和控制系统不一致什么被更换了”时&#xf…

游戏代码C

以下将结合不同编程语言的特点及游戏开发中的实际应用&#xff0c;展示多种语言的游戏代码示例&#xff08;以简单游戏为例&#xff0c;展示代码结构和逻辑差异&#xff09;。由于代码篇幅较长&#xff0c;我将分语言进行说明并引用相关来源&#xff1a; 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略实现与实战指南

引言 在LangChain的Agent框架中&#xff0c;zero-shot-react-description 是一种预定义的Agent类型&#xff0c;它结合了Zero-Shot&#xff08;零样本学习&#xff09; 和 ReAct&#xff08;推理行动&#xff09; 策略&#xff0c;主要用于根据工具的描述动态选择和执行工具&a…

PyQt 或 PySide6 进行 GUI 开发文档与教程

一、官网文档 Qt 官方文档&#xff1a;Porting to Qt 6 | Qt 6.9Qt 维基&#xff1a;​​​​​​​Qt WikiQt for Python (PySide6) &#xff1a;​​​​​​​Qt for Python - Qt WikiPySide6 快速上手指南&#xff1a;​​​​​​​Getting Started - Qt for Python PyS…

2024年第十五届蓝桥杯省赛B组Python【 简洁易懂题解】

2024年第十五届蓝桥杯省赛B组Python题解 一、整体情况说明 2024年第十五届蓝桥杯省赛B组Python组考试共包含8道题目&#xff0c;分为结果填空题和程序设计题两类。 考试时间&#xff1a;4小时编程环境&#xff1a;Python 3.x&#xff0c;禁止使用第三方库&#xff0c;仅可使…

Go语言--语法基础4--基本数据类型--类型转换

Go 是一种强类型的语言&#xff0c;所以如果在赋值的时候两边类型不一致会报错。一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换&#xff0c;因此所有的类型转换都必须显式的声明。 强制类型转换语法 使用 type (a) 这种形式来进行强制类型转换&am…