SCGI 服务器详解
1 协议与报文格式
项目 | 说明 |
---|---|
连接类型 | 长连接,单条 TCP/UnixSocket 可传多请求;由前端(Nginx 等)维护 keep-alive。 |
报文分段 | "<len>:" + <header netstring> + "," + <body> |
<len> 计数 | 10 进制 ASCII,只计算 header 区(不含冒号和逗号)。 |
Header 编码 | NUL (0x00 ) 分隔 key/value 对;结尾需有额外的 0x00 作为终止。 |
必备键 | SCGI=1 , CONTENT_LENGTH , REQUEST_METHOD , REQUEST_URI , SERVER_PROTOCOL , SERVER_NAME , SERVER_PORT , REMOTE_ADDR … (完全沿袭 CGI 环境变量命名) |
正文编码 | 不做转换,按 CONTENT_TYPE 由后端自行解析。 |
响应格式 | 纯 HTTP:Status: 、Content-Type: 、自定义 Header… 连同空行和 body 一并返回。 |
错误闭包 | 后端若直接 close() 连接,Nginx 会向客户端返回 502 Bad Gateway ;若想返回 5xx,可主动输出 Status: 500\r\n… 。 |
Netstring 解析示例
Header 若为
CONTENT_LENGTH\x0013\x00SCGI\x001\x00REQUEST_METHOD\x00POST\x00
则总字节为 53,首部写成
53:
,之后接逗号分隔正文。
2 前端服务器支持矩阵 & 重要指令
前端 | 支持方式 | 关键指令/模块 | 特殊注意 | |
---|---|---|---|---|
Nginx | 原生 | scgi_pass , scgi_param , scgi_buffers , scgi_cache 等(ngx_http_scgi_module ) | 一定 include scgi_params ;可用 unix:/run/app.sock 提升性能 | |
Apache | mod_proxy_scgi | `ProxyPass "unix:/tmp/app.sock | scgi://localhost/"` | 需启用 mod_proxy & mod_proxy_scgi |
Caddy 2 | 核心 | reverse_proxy unix//run/app.sock scgi | Caddy 会自动转换头部 | |
lighttpd | mod_scgi | scgi.server = ("/" => ( "socket" => "/tmp/app.sock" )) | 早期版本默认一次连接只跑一次请求 | |
HAProxy | TCP 直透 | mode tcp + 适当的 timeout 配置 | 仅做四层负载,不解析 SCGI 头 |
Nginx 常用 scgi_*
指令表
指令 | 作用 | 默认 | 建议值 / 场景 |
---|---|---|---|
scgi_buffers | 设置几个缓存区缓存上游响应 | 8 4k | 大文件下载改成 16 16k |
scgi_busy_buffers_size | 响应过大时一次性写磁盘的阈值 | 无 | 与上行 buffer 总和相同 |
scgi_read_timeout | 等后端响应最大时间 | 60s | SSE/长轮询调到 1h |
scgi_next_upstream | 发生哪些错误自动重试 | error timeout | 加入 invalid_header http_500 http_502 等 |
scgi_cache | 启动 Nginx 层缓存 | off | 静态或幂等 GET 场景可提升 QPS |
3 多语言实现参考
3.1 Go(标准库版本,可平滑复用 net/http
Handler)
// go run scgi-http-adapter.go
package mainimport ("bufio""io""log""net""net/http""strconv""strings"
)func main() {ln, err := net.Listen("unix", "/run/app.sock") // ★ Unix Socketif err != nil { log.Fatal(err) }for {conn, _ := ln.Accept()go serve(conn)}
}func serve(c net.Conn) {defer c.Close()br := bufio.NewReader(c)for {size, err := readSize(br)if err != nil { return }hdr := make([]byte, size)if _, err = io.ReadFull(br, hdr); err != nil { return }if b, _ := br.ReadByte(); b != ',' { return }env := parse(hdr)contentLen, _ := strconv.Atoi(env["CONTENT_LENGTH"])body := io.LimitReader(br, int64(contentLen))req, _ := http.NewRequest(env["REQUEST_METHOD"], env["REQUEST_URI"], body)for k, v := range env {if strings.HasPrefix(k, "HTTP_") {req.Header.Set(cgiToHeader(k), v)}}resp := newBufferedResponse()http.DefaultServeMux.ServeHTTP(resp, req) // ★ 复用现有 http.Handlerresp.WriteTo(c)}
}// readSize/parse/cgiToHeader/newBufferedResponse 见附录…
优势:直接挂任何 net/http
生态(Gin、Echo、Chi…)。
劣势:缺少连接池、超时控制需自行包装(可借助 context
)。
3.2 Python
pip install flup6
python -m flup.server.scgi --bind=/run/app.sock myapp:application
flup6
兼容 WSGI;部署 Gunicorn 时加-k scgi
.- 性能高于 mod_wsgi/FastCGI(少一层帧解析)。
3.3 Rust
// Cargo.toml -> scgi = "0.3"
use scgi::Server;
fn main() {Server::bind("/run/app.sock").serve(|req| {format!("Status: 200 OK\r\nContent-Type: text/plain\r\n\r\nHi {}", req.path)}).unwrap();
}
实测 TPS:使用 Tokio +
scgi-async
crate,Ryzen 7 5800X 单核可跑 ≈130 k req/s(8 KiB 响应)。
4 性能与容量规划
层面 | 建议 |
---|---|
前端连接数 | worker_connections × scgi_buffers 大小 ≈ 峰值并发 × 平均响应体积 / 0.75 |
后端进程模型 | CPU 密集:每核 1 进程;IO 密集:每核 ≥2 进程或异步模型 |
TCP 优化 | 后端监听 SO_REUSEPORT ;内核调大 somaxconn=65535 、tcp_tw_reuse=1 |
Unix Socket VS TCP | 本机建议 UDS(平均省 10–15 μs RTT、无需检查端口防火墙) |
Bench 工具 | wrk -t4 -c200 -d30s --script=bench.lua http://127.0.0.1/ ;或直接 ab 、hey |
5 监控、日志与诊断
监控项 | 采集方式 | ||
---|---|---|---|
QPS / 延迟 | Nginx $request_time 、$upstream_response_time ;Prometheus-Exporter | ||
后端饱和 | `netstat -an | grep ESTAB | wc -l`;应用内暴露 Goroutine/Thread 数 |
5xx 比例 | Nginx log_format 打标签,Grafana 走日志聚合 | ||
连接泄漏 | 长连接但无请求时,应定期 PING 或使用 scgi_connect_timeout | ||
抓包调试 | socat -x -v TCP-LISTEN:9999,fork,reuseaddr,bind=127.0.0.1 UNIX-CONNECT:/run/app.sock |
故障定位思路
- 502 → 检查后端监听 / 权限 / SELinux。
- 长轮询超时 → 调大
scgi_read_timeout
并确认后端flusher.Flush()
。- POST 大文件断流 →
client_max_body_size
+ 后端CONTENT_LENGTH
正确解析。
6 安全 & 多租户
- 最小暴露面:Nginx ↔ 后端使用 UDS + chmod 660;TCP 时仅监听
127.0.0.1
/::1
。 - 资源隔离:Docker / systemd-slice;限制 fd/CPU/Memory。
- 请求体大小:双端限制:
client_max_body_size 10m;
+ 业务校验CONTENT_LENGTH
。 - Header 注入:Nginx 默认会把非法字符剔除;后端仍需白名单校验。
- DoS 防护:
limit_req_zone $binary_remote_addr zone=rl:10m rate=20r/s;
。 - 日志脱敏:对
QUERY_STRING
/ Body 按 key 进行“星号掩码”或哈希。
7 容器化 & CI/CD
主题 | 方案 | ||
---|---|---|---|
镜像层次 | FROM golang:1.22-alpine AS build → go build → FROM alpine 仅拷贝二进制 | ||
健康检查 | `HEALTHCHECK CMD wget -qO- --post-data=‘’ http://localhost/health | exit 1` | |
热更新 | Kubernetes RollingUpdate ;或 systemd socket-activation 配合二进制重载 | ||
配置注入 | Nginx include /etc/nginx/conf.d/*.conf; ;后端读取环境变量 | ||
多实例调度 | 使用 Sidecar 模式共享 /run/app.sock ;或前端跑 DaemonSet ,Pod 内本地调用 |
8 常见坑 & FAQ
症状 | 根因 | 处理 |
---|---|---|
connect() failed (111: Connection refused) | 后端未监听 / 路径错 | 检查 scgi_pass unix:/run/app.sock 路径 & 权限 |
请求巨慢但 CPU 空闲 | Nginx → 后端 socket backlog 满 / 上游慢 | 调 net.core.somaxconn 、worker_connections ;排查 DB |
上传文件损坏 | 二进制 body 被当作文本处理 | io.Copy 不做编码转换;禁用 CRLF 变换 |
Header 丢失 | 漏配 scgi_param HTTP_... $http_... | 自定义 Header 需手动声明 |
403 Forbidden (static path) | Nginx location 重叠 | location /static/ { root /var/www; } 优先级高于 / |
9 延伸阅读与工具
- 官方协议:
scgi.org
(原草案存档)。 - ngx_http_scgi_module 文档:详列全部 30+ 指令。
- scgi-curl:命令行 SCGI 客户端,可直接
scgi-curl -d 'k=v' /run/app.sock /hello
. - uWSGI docs “SCGI gateway”:展示 SCGI 与其他协议桥接方式。
- Paper:“Netstrings: A formal network encoding”——理论来源。
结语
- SCGI 的定位是 “足够轻 + 简单 + 长连接”;
- 在 本地 IPC / 同机多语言微服务 场景下,往往优于 FastCGI/HTTP;
- 若需要更丰富管理功能(进程池、平滑 reload、指标),可套 supervisor / systemd / uwsgi;
- 按本文路线完成 PoC → 接入监控 → 优化缓冲区 → 上线即可达到 10^5 RPS 级别。
如需 代码审阅、Nginx 高级调优、K8s YAML 示例或性能基准脚本,告诉我具体环境,我再细化。
相关文章:
SCGI 服务器详解
1 协议与报文格式 项目说明连接类型长连接,单条 TCP/UnixSocket 可传多请求;由前端(Nginx 等)维护 keep-alive。报文分段"<len>:" <header netstring> "," <body><len> 计数10 进…...
Linux问题排查-找到偷偷写文件的进程
在 Linux 系统中,若要通过已修改的文件找到修改该文件的进程 PID,可以结合以下方法分析,具体取决于文件是否仍被进程打开或已被删除但句柄仍存在: 一、文件仍被进程打开(未删除) 如果文件当前正在被某个进…...
Linux的权限问题
引入:权限的意义是什么? 权限就是为了让人能做某些事或不能做某些事 一:Linux下的用户种类 Linux下只有两种用户:root 和 普通用户 root:拥有至高无上的权限,任何的权限都不能限制root 普通用户…...
WPF技巧-BindingProxy
WPF技巧-BindingProxy 文章目录 WPF技巧-BindingProxy🔍 分析与解释1. **继承 Freezable**2. **重写 CreateInstanceCore 方法**3. **定义 DependencyProperty:Data** ✅ 使用场景场景说明:解决方案:示例 XAML: &#…...
深度解析:Redis 性能优化全方位指南
Redis 作为当前最流行的内存数据库之一,以其高性能、低延迟和丰富的数据结构支持,被广泛应用于缓存、消息队列、实时统计等场景。然而,随着业务规模的增长,Redis 可能面临性能瓶颈,如高延迟、内存不足、吞吐量下降等问…...
OpenHarmony外设驱动使用 (五),Fingerprint_auth
OpenHarmony外设驱动使用 (五) Fingerprint_auth 概述 功能简介 指纹认证是端侧设备不可或缺的功能,为设备提供用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册指纹后,指纹认证模块就可为设…...
.NET外挂系列:2. 了解强大的 harmony 注解特性
一:背景 1. 讲故事 上一篇我们简单的聊了下harmony外挂的基本玩法,让大家宏观上感受到了外挂在 .NET高级调试 领域的威力,这一篇我们从 注解特性 这个角度继续展开。 二:harmony 注解特性 1. HarmonyPatch 解读 在harmony支持…...
【Arm】应用ArmDS移植最小FreeRTOS系统
一、文档背景 FreeRTOS(Free Real-Time Operating System)是一个开源的实时操作系统内核,广泛应用于嵌入式系统。它具有小巧、灵活、低功耗等特点,支持多任务调度、信号量、队列等实时操作系统基本功能。 将FreeRTOS移植到特定硬…...
Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)
一、labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是I…...
Axure跨页面交互:利用IFrame和JS实现父子页面菜单联动
在 Axure 中使用内联框架(IFrame)进行父子页面间的通信是一个非常有效的技巧,尤其是在需要实现复杂交互逻辑时。通过 JavaScript 直接操作 DOM 元素,可以突破 Axure 基础元件的限制,实现更灵活的页面联动。以下是对你描…...
百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践
什么是OCR? OCR(Optical Character Recognition,光学字符识别)是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式(如TXT、Word、PDF等)的技术。它广泛应用于文档数字化、信息提取、自动化…...
救生衣穿戴检测数据集VOC+YOLO格式2171张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2171 标注数量(xml文件个数):2171 标注数量(txt文件个数):2171 …...
JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.
环境: vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述: JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...
信号量基础入门:并发控制的核心概念
问题的复杂性产生的根本原因在于,如 2.2 节所述,共享变量的访问始终是“单向信息流”。也就是说,一个进程可以分配新值或检查当前值,但这种检查不会为其他进程留下任何痕迹。结果是,当一个进程想要对共享变量的当前值作…...
物联网之使用Vertx实现HTTP/WebSocket最佳实践
小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现HTTP-Server和WebSocket-Server 实现Http/WebSocket【响应式】 Vertx-Web地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简单,懒得讲解啦 代码…...
【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散
引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...
使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接
一、模块简介 版本:自 NGINX 0.7.18 起引入 功能: 签名校验:对请求 URI 中的签名进行校验,保证链接未经篡改。时效控制:根据请求中携带的过期时间,判断链接是否仍在有效期。 启用方式:编译 NG…...
5月19日day30打卡
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...
NW860NW894美光闪存颗粒NX770NX789
在数字化浪潮席卷全球的当下,数据存储技术的革新正以惊人的速度推动着硬件性能的边界。美光科技作为半导体存储领域的领军者,其NW860、NW894、NX770、NX789系列闪存颗粒凭借前沿架构与精密工艺,成为高性能存储解决方案的核心载体。本文将深入…...
高性能锁机制 CAS:Java 并发编程中的深度剖析
引言 在并发编程领域,i操作的非线程安全性是开发者们熟知的问题。这一现象根源在于i并非原子操作,其内部执行过程包含读取、修改和写入三个步骤,在多线程环境下极易因线程切换导致数据竞争与不一致,这与我们此前探讨的多线程常见问…...
leetcode 每日一题 1931. 用三种不同颜色为网格涂色
题目 1931. 用三种不同颜色为网格涂色 思路 先获取列表,上下左右的所有情况。解决一维的问题 然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索) 然后使用递归,进行累加 代…...
解决Windows磁盘管理中因夹卷导致的无法分区问题
解决Windows磁盘管理中因夹卷导致的无法分区问题 在现代计算机管理中,磁盘分区是一个常见且重要的操作。无论是为了优化存储空间,还是为了实现多系统安装,合理的磁盘分区都是必不可少的。然而,许多用户在使用Windows磁盘管理工具…...
龙虎榜——20250519
上证指数缩量收十字星,个股涨多跌少,这周反弹的概率比较大。 深证指数缩量调整,临近反弹,个股表现更好。 2025年5月19日龙虎榜行业方向分析 化工(新能源材料国产替代) • 代表个股:红宝丽、…...
Python在自动驾驶数据清洗中的应用
Python在自动驾驶数据清洗中的应用 在自动驾驶领域,数据是算法的燃料。高质量的数据意味着更精准的模型,更稳定的驾驶体验。然而,原始数据通常充满噪声、缺失值、不一致格式,甚至有异常点,这些都会严重影响自动驾驶系统的可靠性。因此,数据清洗是一道绕不开的关卡。 一…...
腾讯云Mysql实现远程链接
1.SQL语句:CREATE USER remote_user% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO remote_user%; FLUSH PRIVILEGES; 2.设置入站规则 3.设置安全组 4.效果...
大模型(2)——提示工程(Prompt Engineering)
文章目录 一、提示工程的核心概念为什么需要提示工程? 二、提示设计的基本原则三、实用提示工程技巧1. 角色设定法2. 示例引导法(Few-Shot Learning)3. 分阶段提问4. 负面约束5. 温度(Temperature)控制 四、不同任务类…...
深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈
引言 Java的垃圾回收(GC)机制是JVM性能的核心,但即使是最先进的G1(Garbage-First)收集器,在复杂场景下仍可能引发长时间停顿(Stop-The-World, STW)或吞吐量骤降。许多开发者虽然熟…...
DAPO:用于指令微调的直接偏好优化解读
一、背景与动机:从RLHF到DPO,再到DAPO 大型语言模型(LLM)经过海量无监督预训练后,往往需要对齐人类偏好或遵循指令的微调,使模型的回答更符合人类期望。这一过程通常通过人类反馈强化学习(RLHF)来实现。例如OpenAI的ChatGPT就使用了RLHF:先让人工标注对模型输出进行偏…...
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
vue2 打包生成text文件 和 前端项目的版本号json文件 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息生成版本号json文件-自动记录当前版本号、打包时间等信息新建branch-version-webpack-plugin.js文件 // 同步子进程 const execSyn…...
iOS解码实现
import Foundation import VideoToolboxclass KFVideoDecoderInputPacket {var sampleBuffer: CMSampleBuffer? }class KFVideoDecoder {// MARK: - 常量private let kDecoderRetrySessionMaxCount 5private let kDecoderDecodeFrameFailedMaxCount 20// MARK: - 回调var pi…...
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全 参考链接: https://zhuanlan.zhihu.com/p/454259765...
在Excel中使用函数公式时,常见错误对应不同的典型问题
在Excel中使用函数公式时,常见错误对应不同的典型问题 1. #DIV/0!(除以零错误)2. #N/A(值不可用)3. #NAME?(名称错误)4. #NULL!(空交集错误)5. #NUM!(数值错…...
Excel
1.快捷键 CtrlE 快速填充 CtrlQ 快速分析 CtrlEnter 原位填充 Tab 横向移动到下一个单元格 Enter 移动到下一行起始位置对应单元格 Shift 返回上一个单元格 0空格分数 显示分数 1.if if(condition,true,false)if(A1>10,"true","fa…...
Rust 学习笔记:错误处理
Rust 学习笔记:错误处理 Rust 学习笔记:错误处理不可恢复的错误带有结果的可恢复错误匹配不同的错误出现错误时 panic 的快捷方式:unwrap 和 expect传播错误传播错误的快捷方式:? 操作符哪里可以使用 ? 操作符 panic or not pan…...
【Linux】系统指令与开发全栈(vim、ssh、gcc)
【Linux】系统指令与开发全栈(vim、ssh、gcc) 一、Linux 系统指令大全 1、文件与目录管理 基础操作 指令参数说明典型用例注意事项cd~ 家目录,- 返回上级,.. 上级目录cd ~/Documents 进入文档目录无目录权限时会报错ls-l 详情&am…...
用 CodeBuddy 搭建「MiniGoal 小目标打卡器」:一次流畅的 UniApp 开发体验
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在日常生活中,我们总是希望能够坚持一些小习惯,比如每天锻炼十分钟、读一页书、早睡十分…...
前端(vue)学习笔记(CLASS 6):路由进阶
1、路由的封装抽离 将之前写在main.js文件中的路由配置与规则抽离出来,放置在router/index.js文件中,再将其导入回main.js文件中,即可实现路由的封装抽离 例如 //index.js import { createMemoryHistory, createRouter } from vue-routerim…...
ubuntu 安装 Redis新版Redis 7.x
以下是在Ubuntu系统中安装Redis的详细指南, 一、官方APT源安装 sudo apt install redis-server -y 默认安装最新APT源版本(Ubuntu 22.04通常为Redis 6.x) 服务自动启动,配置文件路径:/etc/redis/redis.conf验证安装 …...
Httphelper: Http请求webapi小记
文章目录 1、HttpHelper.cs Framework4.812、HttpHelper.cs NET83、JsonHelper.cs Framework4.814、JsonHelper.cs NET85、uniapp request.js 访问WEBAPI 每次查找、测试都比较费事,记录一下把 1、HttpHelper.cs Framework4.81 using System; using System.IO; usi…...
【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)
目录 一、进程创建 1、fork函数 2、页表权限 二、进程终止 1、main函数返回值(退出码) 2、常见错误码及其对应的错误描述: 将错误退出码转化为错误描述的方法: 3、进程退出的三种场景 4、由上我们可以知道: 5…...
java+selenium专题->启动浏览器下篇
1.简介 上一篇文章,我们已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中演示一下。 2.eclipse中新建maven项目 1.依次点击eclipse的file - new - other ,如下图所示: 2.在搜索框输入关键字“maven”ÿ…...
sqlserver 循环删除1000行
在SQL Server中,如果你想循环删除1000行数据,有几种方法可以实现,但值得注意的是,频繁使用循环删除操作可能会对数据库性能造成影响,尤其是在处理大量数据时。下面介绍几种方法,并讨论它们的优缺点。 方法…...
亚信电子与联发科技携手打造AIoT新未来
[台湾新竹讯, 2025年5月19日] 智能物联网(AIoT)融合人工智能与物联网技术,通过边缘AI的实时数据分析及设备智能联网能力,加速智能物联网创新应用的蓬勃发展。为满足AIoT产业对多网络端口的应用需求,全球半导体公司【联…...
【成品设计】基于STM32的人体健康监测系统
《基于STM32的人体健康监测系统》 Ps:有4个版本。 V1硬件设计: 主控:STM32F103C8T6:作为系统主控芯片。 血氧心率传感器:用于采集当前心率、血氧值。 温湿度传感器:用于采集当前环境温湿度。 有源低电平触发蜂鸣器&…...
【MySQL进阶】了解linux操作系统下mysql的配置文件和常用选项
前言 🌟🌟本期讲解关于linux下mysql配置选项的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…...
LeetCode 219.存在重复元素 II
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: C代码: Java代码: 题目: 题目描述: 题目链接: 219. 存…...
解释:神经网络
在过去的10年里,表现最好的artificial-intelligence系统——比如智能手机上的语音识别器或谷歌最新的自动翻译——都是由一种叫做“深度学习”的技术产生的 深度学习实际上是一种被称为神经网络的人工智能方法的新名称,这种方法已经流行了70多年。1944年…...
Java 泛型详解
在 Java 的类型系统中,泛型(Generics) 是一个非常重要的特性。它让我们能够编写更通用、更安全的代码,尤其是在处理集合类(如 List、Map 等)时,泛型的使用可以大大减少类型转换的麻烦࿰…...
React集成百度【JSAPI Three】教程(001):快速入门
文章目录 1、快速入门1.1 创建react项目1.2 安装与配置1.3 静态资源配置1.4 配置百度地图AK1.5 第一个DEMO1、快速入门 JSAPI Three版本是一套基于Three.js的三维数字孪生版本地图服务引擎,一套引擎即可支持2D、2.5D、3D全能力的地理投影与数据源加载,帮助开发者轻松搞定平面…...
WPF中资源(Resource)与嵌入的资源(Embedded Resource)的区别及使用场景详解
🌟 开发WPF项目时图片、SVG、配置文件等到底该设置为哪种资源?如何正确读取、跨程序集访问?一篇文章全解答。 在使用 WPF 进行项目开发时,很多开发者在设置文件“生成操作(Build Action)”时,常常会在“资源(Resource)”和“嵌入的资源(Embedded Resource)”之间感…...