Rust Web框架性能對比與實戰指南

Rust Actix Web

Rust Web 框架的實用對比分析

以下是 Rust Web 框架的實用對比分析,涵蓋主要框架(如 Actix-web、Rocket、Warp、Axum 等)的常見使用場景示例,按功能分類整理:

基礎路由設置

Actix-web

use actix_web::{get, App, HttpResponse, HttpServer, Responder};#[get("/")]
async fn hello() -> impl Responder {HttpResponse::Ok().body("Hello Actix!")
}

說明:定義根路徑和動態路徑路由,返回字符串響應。

Rocket

#[macro_use] extern crate rocket;#[get("/")]
fn hello() -> &'static str {"Hello Rocket!"
}

Warp

use warp::Filter;let hello = warp::path::end().map(|| "Hello Warp!");

Axum

use axum::{routing::get, Router};async fn hello() -> &'static str {"Hello Axum!"
}

JSON 請求/響應處理

Actix-web

use actix_web::{web, App};#[derive(serde::Serialize, serde::Deserialize)]
struct User {name: String,
}async fn add_user(user: web::Json<User>) -> String {format!("Added user: {}", user.name)
}

Rocket

#[post("/users", data = "<user>")]
fn add_user(user: Json<User>) -> String {format!("Added user: {}", user.name)
}

Axum

use axum::Json;async fn add_user(Json(user): Json<User>) -> String {format!("Added user: {}", user.name)
}

靜態文件服務

Actix-web

App::new().service(actix_files::Files::new("/static", "./static").show_files_listing(),
);

Warp

warp::path("static").and(warp::fs::dir("./static"));

Rocket

#[launch]
fn rocket() -> _ {rocket::build().mount("/static", FileServer::from("./static"))
}


數據庫集成(SQLx 示例)

Actix-web + SQLx

use sqlx::postgres::PgPool;async fn get_users(pool: web::Data<PgPool>) -> Result<Json<Vec<User>>, Error> {let users = sqlx::query_as!(User, "SELECT * FROM users").fetch_all(pool.get_ref()).await?;Ok(Json(users))
}

Axum + SQLx

async fn get_users(Extension(pool): Extension<PgPool>) -> Result<Json<Vec<User>>, Error> {let users = sqlx::query_as!(User, "SELECT * FROM users").fetch_all(&pool).await?;Ok(Json(users))
}

WebSocket 支持

Actix-web

use actix_web_actors::ws;async fn ws_handler(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {ws::start(MyWebSocket {}, &req, stream)
}

Warp

let ws_route = warp::path("ws").and(warp::ws()).map(|ws: warp::ws::Ws| {ws.on_upgrade(|websocket| async move {// WebSocket 邏輯})});

中間件(日志記錄示例)

Actix-web

App::new().wrap(Logger::default()).service(hello)

Axum

Router::new().route("/", get(hello)).layer(tower_http::trace::TraceLayer::new_for_http());

錯誤處理

Rocket

#[catch(404)]
fn not_found() -> Json<Value> {Json(json!({ "error": "Resource not found" }))
}

Warp

let route = warp::path::end().and_then(|| async { Err(warp::reject::not_found()) }).recover(handle_errors);


文件上傳

Actix-web

async fn upload(mut payload: web::Payload) -> Result<String, Error> {let mut bytes = web::BytesMut::new();while let Some(chunk) = payload.next().await {bytes.extend_from_slice(&chunk?);}// 保存文件邏輯Ok("File uploaded".into())
}

Rocket

#[post("/upload", data = "<file>")]
async fn upload(file: TempFile<'_>) -> std::io::Result<()> {file.persist_to("/uploads/file.txt").await
}


測試框架對比

Actix-web 測試示例

#[actix_rt::test]
async fn test_hello() {let app = test::init_service(App::new().service(hello)).await;let req = test::TestRequest::get().uri("/").to_request();let resp = test::call_service(&app, req).await;assert!(resp.status().is_success());
}

Warp 測試示例

#[tokio::test]
async fn test_hello() {let api = hello();let resp = warp::test::request().path("/").reply(&api).await;assert_eq!(resp.body(), "Hello Warp!");
}


性能對比(概要)

  • Actix-web: 基于 Actor 模型,適合高并發場景
  • Warp: 基于 Filter 組合,靈活但學習曲線較高
  • Axum: 建立在 Tower 生態上,模塊化設計
  • Rocket: 開發體驗友好,但需要 nightly Rust

基于Rust Rocket框架的實例

以下是一些基于Rust Rocket框架的實用示例,涵蓋從基礎到進階的應用場景,幫助開發者快速掌握Rocket的核心功能。

JSON請求與響應

use rocket::serde::{json::Json, Deserialize, Serialize};#[derive(Serialize, Deserialize)]
struct User {id: u64,name: String,
}#[post("/user", data = "<user>")]
fn create_user(user: Json<User>) -> Json<User> {user
}

說明:通過serde實現JSON數據的序列化與反序列化,支持POST請求。


表單處理

use rocket::form::Form;#[derive(FromForm)]
struct LoginForm {username: String,password: String,
}#[post("/login", data = "<form>")]
fn login(form: Form<LoginForm>) -> String {format!("Logged in as: {}", form.username)
}

  • 說明:解析表單數據并處理用戶登錄邏輯。

靜態文件服務

use rocket::fs::{FileServer, relative};#[launch]
fn rocket() -> _ {rocket::build().mount("/static", FileServer::from(relative!("static")))
}
  • 說明:通過FileServer提供靜態文件(如HTML/CSS/JS)服務。

數據庫集成(Diesel)

use rocket_sync_db_pools::database;#[database("postgres_db")]
struct DbConn(diesel::PgConnection);#[get("/users")]
async fn get_users(conn: DbConn) -> Json<Vec<User>> {conn.run(|c| users::table.load(c)).await.map(Json).unwrap()
}

  • 說明:使用diesel連接PostgreSQL數據庫并查詢數據。

身份驗證(JWT)

use rocket::http::Status;
use rocket::request::{self, Request, FromRequest};struct JwtToken(String);#[rocket::async_trait]
impl<'r> FromRequest<'r> for JwtToken {async fn from_request(req: &'r Request<'_>) -> request::Outcome<Self, Status> {// 從Header提取并驗證JWT邏輯Outcome::Success(JwtToken("valid_token".into()))}
}#[get("/protected")]
fn protected_route(token: JwtToken) -> String {format!("Access granted with token: {}", token.0)
}

  • 說明:自定義請求守衛實現JWT驗證。

WebSocket通信

use rocket::response::stream::{EventStream, Event};
use rocket::tokio::time::{interval, Duration};#[get("/events")]
fn stream_events() -> EventStream![] {EventStream! {let mut interval = interval(Duration::from_secs(1));while let Some(_) = interval.next().await {yield Event::data("ping");}}
}

  • 說明:通過EventStream實現服務器推送事件(SSE)。

錯誤處理

use rocket::response::status::Custom;
use rocket::http::Status;#[catch(404)]
fn not_found() -> Custom<String> {Custom(Status::NotFound, "Resource not found".into())
}

  • 說明:自定義404錯誤頁面。

配置環境變量

#[launch]
fn rocket() -> _ {rocket::build().configure(rocket::Config::figment().merge(("port", 8000)))
}
  • 說明:動態修改服務器端口等配置。

測試路由

#[cfg(test)]
mod tests {use super::rocket;use rocket::local::blocking::Client;use rocket::http::Status;#[test]fn test_index() {let client = Client::tracked(rocket()).unwrap();let response = client.get("/").dispatch();assert_eq!(response.status(), Status::Ok);}
}
  • 說明:編寫單元測試驗證路由邏輯。

更多場景

  1. 文件上傳:使用TempFile處理多部分表單上傳。
  2. 速率限制:通過Fairing實現API限流。
  3. 模板渲染:集成terahandlebars渲染HTML。
  4. HTTPS支持:配置TLS證書。
  5. 日志中間件:添加log庫記錄請求日志。

完整示例可參考Rocket官方文檔或GitHub倉庫的示例目錄。

基于Rust Actix-web框架的實例

以下是基于Rust Actix-web框架的實例,涵蓋從基礎到進階的功能實現。所有代碼均經過簡化,確保可直接運行或適配到項目中。

基礎HTTP服務

use actix_web::{get, App, HttpResponse, HttpServer, Responder};#[get("/")]
async fn hello() -> impl Responder {HttpResponse::Ok().body("Hello Actix-web!")
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().service(hello)).bind("127.0.0.1:8080")?.run().await
}

JSON請求與響應

use actix_web::{post, web, App, HttpServer, Responder};
use serde::{Deserialize, Serialize};#[derive(Serialize, Deserialize)]
struct User {name: String,age: u8,
}#[post("/user")]
async fn create_user(user: web::Json<User>) -> impl Responder {HttpResponse::Ok().json(user.into_inner())
}


路徑參數解析

#[get("/user/{id}")]
async fn get_user(path: web::Path<u32>) -> impl Responder {HttpResponse::Ok().body(format!("User ID: {}", path))
}


查詢參數處理

#[get("/search")]
async fn search(query: web::Query<HashMap<String, String>>) -> impl Responder {HttpResponse::Ok().json(query.into_inner())
}


靜態文件服務

use actix_files::Files;App::new().service(Files::new("/static", "./static").show_files_listing(),
)


中間件示例(日志記錄)

use actix_web::middleware::Logger;HttpServer::new(|| {App::new().wrap(Logger::default()).service(hello)
})

自定義錯誤處理

use actix_web::error::ErrorNotFound;async fn custom_404() -> impl Responder {HttpResponse::NotFound().body("Custom 404 Page")
}App::new().service(web::resource("/").to(hello)).default_service(web::to(custom_404))


數據庫集成(SQLx)

use sqlx::postgres::PgPoolOptions;#[post("/user")]
async fn add_user(pool: web::Data<PgPool>,user: web::Json<User>,
) -> Result<HttpResponse, Error> {sqlx::query!("INSERT INTO users (name, age) VALUES ($1, $2)", user.name, user.age).execute(pool.get_ref()).await?;Ok(HttpResponse::Created().finish())
}


WebSocket通信

use actix_web_actors::ws;#[get("/ws/")]
async fn websocket(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {ws::start(MyWebSocket {}, &req, stream)
}


文件上傳

#[post("/upload")]
async fn upload(mut payload: web::Payload) -> Result<HttpResponse, Error> {let mut bytes = web::BytesMut::new();while let Some(chunk) = payload.next().await {bytes.extend_from_slice(&chunk?);}std::fs::write("uploaded_file.txt", bytes)?;Ok(HttpResponse::Ok().finish())
}


JWT認證

use jsonwebtoken::{encode, Header, EncodingKey};#[post("/login")]
async fn login(credentials: web::Json<Credentials>) -> impl Responder {let token = encode(&Header::default(),&claims,&EncodingKey::from_secret("secret".as_ref()),).unwrap();HttpResponse::Ok().json(json!({ "token": token }))
}


限流中間件

use actix_web_middleware_ratelimit::{RateLimiter, MemoryStore};App::new().wrap(RateLimiter::new(MemoryStore::new(), 100, Duration::from_secs(60)))


測試示例

#[cfg(test)]
mod tests {use super::*;use actix_web::test;#[actix_rt::test]async fn test_hello() {let mut app = test::init_service(App::new().service(hello)).await;let req = test::TestRequest::get().uri("/").to_request();let resp = test::call_service(&mut app, req).await;assert!(resp.status().is_success());}
}

CORS配置

use actix_cors::Cors;App::new().wrap(Cors::default().allow_any_origin())

環境變量配置

use std::env;let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
HttpServer::new(|| App::new()).bind(format!("127.0.0.1:{}", port))?

健康檢查端點

#[get("/health")]
async fn health() -> impl Responder {HttpResponse::Ok().json(json!({ "status": "ok" }))
}

后臺任務

use actix_rt::time;async fn background_task() {let mut interval = time::interval(Duration::from_secs(60));loop {interval.tick().await;println!("Background task executed");}
}#[actix_web::main]
async fn main() -> std::io::Result<()> {actix_rt::spawn(background_task());HttpServer::new(|| App::new()).bind("127.0.0.1:8080")?.run().await
}

Prometheus監控

use actix_web_prom::PrometheusMetricsBuilder;let prometheus = PrometheusMetricsBuilder::new("api").endpoint("/metrics").build().unwrap();App::new().wrap(prometheus)

多路由組合

#[get("/api/v1/users")]
async fn list_users() -> impl Responder { /* ... */ }App::new().service(web::scope("/api/v1").service(list_users).service(get_user))

請求超時設置

use actix_web::middleware::Timeout;App::new().wrap(Timeout::new(Duration::from_secs(5)))

壓縮響應

use actix_web::middleware::Compress;App::new().wrap(Compress::default())

結構化日志

use actix_web::middleware::Logger;
use env_logger::Env;env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();App::new().wrap(Logger::new("%a %{User-Agent}i %r %s %Dms"))

信號處理(優雅關閉)

use actix_web::rt::System;let sys = System::new();
let srv = HttpServer::new(|| App::new()).shutdown_timeout(5).bind("127.0.0.1:8080")?;
let _ = srv.run().await;
sys.run().unwrap();

多線程處理

HttpServer::new(|| App::new()).workers(4) // 設置線程數.bind("127.0.0.1:8080")?

自定義響應頭

#[get("/custom")]
async fn custom_header() -> impl Responder {HttpResponse::Ok().append_header(("X-Custom", "Value")).finish()
}

表單處理

#[derive(Deserialize)]
struct FormData {username: String,password: String,
}#[post("/login")]
async fn form_login(form: web::Form<FormData>) -> impl Responder {HttpResponse::Ok().body(format!("Welcome {}", form.username))
}

完整項目結構和更多高級用法可參考官方文檔:https://actix.rs/docs/

基于Rust Warp框架的實例

以下是基于Rust Warp框架的實例,涵蓋路由、中間件、錯誤處理等常見場景,代碼格式嚴格遵循Markdown規范:

基礎路由示例

use warp::Filter;let hello = warp::path!("hello" / String).map(|name| format!("Hello, {}!", name));
let root = warp::path::end().map(|| "Welcome to Warp");

HTTP方法處理

let post_data = warp::post().and(warp::body::json()).map(|data: serde_json::Value| warp::reply::json(&data));

let delete_item = warp::delete().and(warp::path!("items" / u32)).map(|id| format!("Deleted item {}", id));

路徑參數

let user_profile = warp::path!("users" / u32).map(|id| format!("User {} profile", id));

let multi_param = warp::path!("blog" / u32 / String).map(|id, slug| format!("Blog {}: {}", id, slug));

查詢參數

let pagination = warp::path!("list").and(warp::query::<HashMap<String, String>>()).map(|params| format!("Page: {:?}", params));

JSON處理

#[derive(serde::Deserialize)]
struct User {name: String,
}let create_user = warp::post().and(warp::body::json()).map(|user: User| format!("Created user: {}", user.name));

文件服務

let static_files = warp::fs::dir("public");

WebSocket

let ws_echo = warp::path("echo").and(warp::ws()).map(|ws: warp::ws::Ws| ws.on_upgrade(|websocket| async {// 處理WebSocket連接}));

中間件示例

let with_header = warp::reply::with::header("X-Custom", "Value");
let route = warp::any().map(|| "OK").with(with_header);

日志中間件

let log = warp::log("api");
let route = warp::any().map(|| "OK").with(log);

認證中間件

let auth = warp::header::<String>("authorization").and_then(|token| async move {if token != "secret" {Err(warp::reject::custom(MyError::Unauthorized))} else {Ok(())}});

錯誤處理

let handle_rejection = warp::recover(|err: warp::Rejection| async move {if err.find::<warp::reject::MethodNotAllowed>().is_some() {Ok(warp::reply::with_status("Method not allowed",warp::http::StatusCode::METHOD_NOT_ALLOWED,))} else {Ok(warp::reply::with_status("Internal error",warp::http::StatusCode::INTERNAL_SERVER_ERROR,))}
});

CORS配置

let cors = warp::cors().allow_any_origin().allow_methods(vec!["GET", "POST"]);

路由組合

let api_v1 = warp::path("api").and(warp::path("v1").and(warp::path("users").and(warp::get().map(|| "API v1 users")))
);

路徑前綴

let admin_routes = warp::path("admin").and(warp::path("dashboard").map(|| "Admin dashboard")
);

條件路由

let maybe_secure = warp::header::optional::<String>("authorization").map(|token| token.is_some());

流式響應

let stream = warp::path("stream").map(|| {let bytes = (0..10).map(|i| format!("{}\n", i));warp::reply::stream(bytes)});

壓縮響應

let compressed = warp::reply::with::header("content-encoding", "gzip");
let route = warp::any().map(|| "OK").with(compressed);

自定義拒絕

#[derive(Debug)]
struct RateLimited;
impl warp::reject::Reject for RateLimited {}let limited = warp::any().and_then(|| async { Err::<(), _>(warp::reject::custom(RateLimited)) }).recover(|err: warp::Rejection| async {if err.find::<RateLimited>().is_some() {Ok(warp::reply::with_status("Rate limited",warp::http::StatusCode::TOO_MANY_REQUESTS,))} else {Err(err)}});

狀態碼返回

let created = warp::post().map(|| warp::reply::with_status("Created", warp::http::StatusCode::CREATED));

內容協商

let accept_json = warp::header::exact("accept", "application/json");
let route = accept_json.and(warp::any()).map(|| warp::reply::json(&true));

表單處理

#[derive(serde::Deserialize)]
struct Login {username: String,password: String,
}let login = warp::post().and(warp::body::form()).map(|login: Login| format!("Logged in as {}", login.username));

多部分表單

let upload = warp::multipart::form().and_then(|form: warp::multipart::FormData| async move {// 處理文件上傳Ok::<_, warp::Rejection>("Upload complete")});

這些示例覆蓋了Warp框架的核心功能,可以直接集成到實際項目中或作為學習參考。每個示例都保持獨立性和最小化實現,便于按需組合使用。

基于 Rust Axum 框架的實例

以下是基于 Rust Axum 框架的實例,涵蓋從基礎路由到高級功能的應用場景。所有示例均以代碼片段形式呈現,可直接用于項目開發。

基礎路由與請求處理

use axum::{Router, routing::get, response::Html};async fn hello_world() -> Html<&'static str> {Ht

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90771.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【解決vmware ubuntu不小心刪boot分區,進不去系統】

如果仍然提示 Unable to locate package testdisk&#xff0c;有可能是源中不包含該工具&#xff08;LiveCD 使用的是“最小環境”&#xff09;。 &#x1fa9b; 解決方法&#xff1a;切換到國內完整軟件源&#xff08;推薦&#xff09; 編輯 sources.list&#xff1a; sudo na…

04-netty基礎-Reactor三種模型

1 基本概念Reactor模型是一種事件驅動&#xff08;Event-Driven&#xff09;的設計模式&#xff0c;主要用于高效處理高并發、I/O密集型場景&#xff08;如網絡、服務器、分布式等&#xff09;。其核心思想就是集中管理事件&#xff0c;將I/O操作與業務邏輯解耦&#xff0c;避免…

踩坑無數!NFS服務從入門到放棄再到真香的血淚史

前言 說起NFS&#xff0c;我估計很多搞運維的兄弟都有一肚子話要說。這玩意兒吧&#xff0c;看起來簡單&#xff0c;用起來坑多&#xff0c;但是真正搞明白了又覺得挺香的。 前幾天有個朋友問我&#xff0c;說他們公司要搭建一個文件共享系統&#xff0c;問我推薦什么方案。我…

矩陣譜分解的證明及計算示例

1. 矩陣譜分解的條件矩陣的譜分解&#xff08;也稱為特征分解&#xff09;是將一個矩陣分解為一系列由其特征向量和特征值構成的矩陣乘積的過程。進行譜分解的前提條件包括&#xff1a;<1.> 矩陣是可對角化的&#xff08;Diagonalizable&#xff09;&#xff0c;即矩陣存…

Leetcode 07 java

169. 多數元素 給定一個大小為 n 的數組 nums &#xff0c;返回其中的多數元素。 多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例 1&#xff1a; 輸入&#xff1a;nums [3,2,3] 輸出&a…

CS231n-2017 Lecture6訓練神經網絡(一)筆記

本節主要講的是模型訓練時的算法設計數據預處理&#xff1a;關于數據預處理&#xff0c;我們有常用的3個符號&#xff0c;數據矩陣X&#xff0c;假設其尺寸是&#xff0c;N是數據樣本的數量&#xff0c;D是數據的維度均值減法(Mean subtraction)&#xff1a;是預處理最常用的形…

C++ 中實現 `Task::WhenAll` 和 `Task::WhenAny` 的兩種方案

&#x1f4da; C 中實現 Task::WhenAll 和 Task::WhenAny 的兩種方案 引用&#xff1a; 拈朵微笑的花 想一番人世變換 到頭來輸贏又何妨日與夜互消長 富與貴難久長 今早的容顏老於昨晚C 標準庫異步編程示例&#xff08;一&#xff09;C TAP&#xff08;基于任務的異步編程…

【學習】Codeforces Global Round 15 C. Maximize the Intersections

題意&#xff1a;給出一個圓&#xff0c;順時針排布1~2*n&#xff0c;已知連了k條邊&#xff0c;問這個圓最好情況下有多少個線的交點&#xff0c;要求線與線之間不能有重復的連接點&#xff0c;也就是每個點只能被一條線連接 思路&#xff1a; 1.考慮沒有線的時候&#xff0…

圖論:Dijkstra算法

昨天介紹了最小生成樹的兩個算法&#xff0c;最小生成樹的兩個算法旨在求解無向有權圖中的最小代價聯通圖的問題&#xff0c;那么對于有向有權圖&#xff0c;從起點到終點的最小花費代價問題就可以用 Dijkstra 算法來解決而且Dijkstra算法可以求出來從起始點開始到所有節點的最…

WPFC#超市管理系統(2)顧客管理、供應商管理、用戶管理

超市管理系統3. 顧客管理3.1 顧客新增3.2 DataGrid樣式3.3 顧客刪除3.4 顧客修改4. 供應商管理4.1 供應商管理主界面4.2 新增供應商4.3 修改供應商5. 用戶管理5.1 用戶管理主界面5.2 新增用戶5.3 修改用戶總結3. 顧客管理 在CustomerView.xaml使用命令綁定方式添加頁面加載Loa…

Windows本地部署DeepSeek

1、Ollama1、下載Ollama安裝包https://ollama.com/download&#xff08;如果下載很慢 可以直接找我拿安裝包&#xff09;2、使用命令行安裝打開cmd 將下載的安裝包OllamaSetup.exe 放到想要安裝的目錄下。&#xff08;如果直接雙擊&#xff0c;會裝到C盤&#xff09;例如想裝到…

基于Python的新聞爬蟲:實時追蹤行業動態

引言 在信息時代&#xff0c;行業動態瞬息萬變。金融從業者需要實時了解政策變化&#xff0c;科技公司需要跟蹤技術趨勢&#xff0c;市場營銷人員需要掌握競品動向。傳統的人工信息收集方式效率低下&#xff0c;難以滿足實時性需求。Python爬蟲技術為解決這一問題提供了高效方…

阿里視頻直播解決方案VS(MediaMTX + WebRTC) 流媒體解決方案

背景&#xff1a; 公司采購了新的攝像頭&#xff0c;通過rtsp或者rtmp推流到云平臺&#xff0c;云平臺內部進行轉碼處理&#xff0c;客戶端使用HLS或HTTP-FLV播放&#xff0c;移動App可能使用HLS或私有SDK&#xff0c;超低延時則采用WebRTC。 技術選型&#xff1a; RTSP&…

day33:零基礎學嵌入式之網絡——TCP并發服務器

一、服務器1.服務器分類單循環服務器&#xff1a;只能處理一個客戶端任務的服務器并發服務器&#xff1a;可同時處理多個客戶端任務的服務器二、TCP并發服務器的構建1.如何構建&#xff1f;&#xff08;1&#xff09;多進程&#xff08;每一次創建都非常耗時耗空間&#xff0c;…

VR全景制作的流程?VR全景制作可以用在哪些領域?

VR全景制作的流程&#xff1f;VR全景制作可以用在哪些領域&#xff1f;VR全景制作&#xff1a;流程、應用與未來虛擬現實&#xff08;VR&#xff09;全景制作正迅速改變我們的感官體驗&#xff0c;使我們能夠身臨其境地探索虛擬世界&#xff0c;享受沉浸式的奇妙感受。那么&…

用LangChain重構客服系統:騰訊云向量數據庫+GPT-4o實戰

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 目錄 一、傳統客服系統痛點與重構價值 1.1 傳統方案瓶頸分析 1.2 新方案技術突破點 二、系統架構設計&…

主要分布在腹側海馬體(vHPC)CA1區域(vCA1)的混合調諧細胞(mixed-tuning cells)對NLP中的深層語義分析的積極影響和啟示

腹側海馬體CA1區&#xff08;vCA1&#xff09;的混合調諧細胞&#xff08;mixed-tuning cells&#xff09;通過整合情感、社會關系、空間概念等多模態信息&#xff0c;形成動態的情景化語義表征&#xff0c;為自然語言處理&#xff08;NLP&#xff09;的深層語義分析提供了重要…

ESP32的ADF詳解:6. Audio Processing的API

一、Downmix 1. 核心功能 將基礎音頻流和新加入音頻流混合為單一輸出流&#xff0c;支持動態增益控制和狀態轉換。輸出聲道數與基礎音頻一致&#xff0c;新加入音頻自動轉換聲道匹配。2. 關鍵特性聲道處理 輸出聲道數 基礎音頻聲道數新加入音頻自動轉換聲道&#xff08;如立體…

Qt(基本組件和基本窗口類)

一、基本組件1. Designer設計師為什么要上來先將這個東西呢&#xff0c;這個是QT外置的設計界面的工具&#xff0c;沒啥用&#xff0c;所以了解一下。我們用的多的是QT內置的界面設計&#xff0c;只需要我們雙擊我們創建的項目的.ui文件就可以進入這個界面&#xff0c;你對界面…

docker與k8s的容器數據卷

Docker容器數據卷 特性 docker鏡像由多個只讀層疊加而成&#xff0c;啟動容器時&#xff0c;Docker會加載只讀鏡像層并在鏡像棧頂部添加一個讀寫層。如果運行中的容器修改了現有的一個已經存在的文件&#xff0c;那么該文件將會從讀寫層下面的只讀層復制到讀寫層&#xff0c;該…