gpt4 book ai didi

rust - 如何使用 Tokio 远程关闭正在运行的任务

转载 作者:行者123 更新时间:2023-12-03 11:24:46 30 4
gpt4 key购买 nike

我有一个正在接收数据的 UDP 套接字

pub async fn start()  -> Result<(), std::io::Error> {
loop {
let mut data = vec![0; 1024];
socket.recv_from(&mut data).await?;
}
}
此代码目前在 .await 上被阻止当没有数据进入时。我想从我的主线程优雅地关闭我的服务器,那么我如何向这个 .await 发送信号?它应该停止 sleep 并关闭吗?

最佳答案

注: Tokio 网站在 graceful shutdown 上有一个页面.
如果你有多个任务要终止,你应该使用 broadcast channel发送关机消息。您可以与 tokio::select! 一起使用.

use tokio::sync::broadcast::Receiver;

// You may want to log errors rather than return them in this function.
pub async fn start(kill: Receiver<()>) -> Result<(), std::io::Error> {
tokio::select! {
output = real_start() => output,
_ = kill.recv() => Err(...),
}
}

pub async fn real_start() -> Result<(), std::io::Error> {
loop {
let mut data = vec![0; 1024];
socket.recv_from(&mut data).await?;
}
}
然后杀死所有任务,在 channel 上发送一条消息。

要仅终止单个任务,您可以使用 JoinHandle::abort 方法,这将尽快杀死任务。请注意,此方法仅在 Tokio 1.x 和 0.3.x 中可用,要使用 Tokio 0.2.x 中止任务,请参阅下面的下一节。
let task = tokio::spawn(start());

...

task.abort();

作为 JoinHandle::abort 的替代方案,您可以使用 abortable 从 future 箱。生成任务时,请执行以下操作:
let (task, handle) = abortable(start());
tokio::spawn(task);
然后你可以通过调用 abort 来终止任务。方法。
handle.abort();
当然还有 select!的 channel 也可以用来杀死单个任务,也许结合 oneshot channel 而不是广播 channel 。

所有这些方法都保证了 real_start方法在 .await 处被终止.在两个 .await 之间运行代码时无法终止任务s。您可以阅读更多关于为什么是这样的信息 here .
mini-redis项目包含一个可访问的真实关闭服务器的示例。此外,Tokio 教程有关于 select 的章节。和 channels .

关于rust - 如何使用 Tokio 远程关闭正在运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084955/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com