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 日

#340Unix API

每月 31 次下载

MIT/Apache

19KB
246

Docs

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