7 个版本 (4 个破坏性版本)
0.5.1 | 2024 年 5 月 4 日 |
---|---|
0.5.0 | 2024 年 3 月 18 日 |
0.4.0 | 2024 年 2 月 11 日 |
0.3.1 | 2024 年 1 月 27 日 |
0.1.1 | 2023 年 2 月 23 日 |
#340 在 Unix API 中
每月 31 次下载
19KB
246 行
Prefork
在 Rust 中分叉进程以创建多个子进程。
此仓库包含一个 Rust 包。请参阅代码仓库中的 示例代码,该代码打开一个套接字,然后在该套接字上分叉多个进程以接受连接。这是一种老式的多进程方式,但在处理多线程运行不佳的系统(例如,嵌入 Python 解释器)时有时很有用。
贡献
欢迎提出问题和 PR。可以使用 Github 用户 ID 登录。
此仓库在 codeberg 上进行了镜像。
lib.rs
:
支持 prefork 服务器。
prefork 是一种老式的多进程方式,但在处理多线程运行不佳的系统(例如,嵌入 Python 解释器)时有时很有用。
功能
默认情况下,该包包括 tokio 作为依赖项以启动异步服务器。如果不需要 tokio,请将 prefork
作为依赖项包含,但不包含默认功能
[dependencies]
prefork = {version = "...", default-features = false}
示例
此示例打开一个套接字,然后在该套接字上分叉多个进程以接受连接。要运行示例,请参阅代码仓库中的 examples/axum.rs
cargo run --example axum
Web 服务器示例
use std::{net::TcpListener, process};
use axum::{extract::State, routing::get, Router};
use log::info;
use prefork::Prefork;
async fn child(child_num: u32, listener: TcpListener) {
let pid = process::id();
let router = Router::new()
.route(
"/",
get(|State((pid, child_num))| async move {
format!("Hello from {child_num} with pid {pid}")
}),
)
.with_state((pid, child_num));
let listener = tokio::net::TcpListener::from_std(listener)
.expect("bind to port");
axum::serve(listener, router).await.expect("start server");
}
fn main() {
let listener = TcpListener::bind("0.0.0.0:3000").expect("bind to port");
listener.set_nonblocking(true).expect("nonblocking");
let is_parent = Prefork::from_resource(listener)
.with_num_processes(10)
.with_tokio(child)
.fork()
.expect("fork");
if is_parent {
info!("Parent exit");
}
}
依赖项
~4–13MB
~143K SLoC