3个版本 (破坏性更新)
0.3.0 | 2024年7月4日 |
---|---|
0.2.0 | 2022年11月15日 |
0.1.0 | 2021年2月8日 |
#220 in 异步
每月13,142次下载
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