3个版本 (破坏性更新)

0.3.0 2024年7月4日
0.2.0 2022年11月15日
0.1.0 2021年2月8日

#220 in 异步

Download history 4298/week @ 2024-04-26 3616/week @ 2024-05-03 5319/week @ 2024-05-10 2197/week @ 2024-05-17 3696/week @ 2024-05-24 1341/week @ 2024-05-31 3245/week @ 2024-06-07 2846/week @ 2024-06-14 4064/week @ 2024-06-21 2391/week @ 2024-06-28 3296/week @ 2024-07-05 1966/week @ 2024-07-12 2778/week @ 2024-07-19 2985/week @ 2024-07-26 3765/week @ 2024-08-02 3390/week @ 2024-08-09

每月13,142次下载

Apache-2.0

21KB
291 代码行

一个库,使异步代码中的优雅关闭变得更容易。

这提供了工具,以便在最终关闭之前等待挂起的任务完成。

示例

use graceful_shutdown::Shutdown;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpListener;
use tokio::signal;
use tokio::{select, spawn};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let shutdown = Shutdown::new();
    let listener = TcpListener::bind("127.0.0.1:8000").await?;
    spawn(shutdown.shutdown_after(signal::ctrl_c()));
    loop {
       match shutdown.cancel_on_shutdown(listener.accept()).await {
           Some(Ok((mut conn, _))) => {
               spawn(shutdown.graceful(async move {
                   let mut buf = [0; 1024];
                   loop {
                       let n = match conn.read(&mut buf).await {
                           Ok(n) if n == 0 => return,
                           Ok(n) => n,
                           Err(e) => {
                               eprintln!("failed to read from socket; err = {:?}", e);
                               return;
                           }
                       };
                       if let Err(e) = conn.write_all(&buf[0..n]).await {
                           eprintln!("failed to write to socket; err = {:?}", e);
                           return;
                       }
                   }
               }));
           }
           Some(Err(e)) => {
               eprintln!("Error accepting connection; err = {:?}", e);
               shutdown.shutdown();
           }
           None => {
               eprintln!("Starting shutdown");
               break;
           }
       }
    }
    shutdown.await;
    Ok(())
}

依赖项

~0–10MB
~91K SLoC