我有一个main
函数,其中创建了一个时雄运行时并在其上运行两个future。
use tokio;
fn main() {
let mut runtime = tokio::runtime::Runtime::new().unwrap();
runtime.spawn(MyMegaFutureNumberOne {});
runtime.spawn(MyMegaFutureNumberTwo {});
// Some code to 'join' them after receiving an OS signal
}
如何接收SIGTERM
,等待所有未完成的任务(NotReady
)并退出应用程序?
2条答案
按热度按时间ccgok5k51#
处理信号是很棘手的,要解释如何处理所有可能的情况太宽泛了。信号的实现不是跨平台的标准,所以我的答案是针对Linux的。如果你想更跨平台,使用POSIX函数
sigaction
结合pause
;这会给你更多的控制权。时雄的文档中有一个很好的getting started guide用于tokio中的信号。因此,我将尝试添加我自己的建议。
我的一般建议是有一个任务,将处理信号为我们,然后您使用一个手表通道在您的其他任务,将停止,如果手表通道状态发生变化。
我的第二个建议是在
select
上使用biased
,因为select
会等待你的将来,这是很重要的,因为你通常想知道一个信号是否已经被立即接收到,而不是在之前做其他事情。这可能是一个经常准备就绪的忙碌循环的问题,你永远不会得到你的信号将来分支。请仔细阅读关于biased
的文档。您可以克隆的接收器的通道需要,这将使有效地处理信号。
时雄0.1
实现您所需的一种方法是使用tokio_signal crate捕获信号,如下所示:(doc example)
此程序将等待所有当前任务完成,并将捕获选定的信号。这似乎在Windows上不起作用,因为它会立即关闭程序。
vjhs03f72#
对于时雄版本1.x.y,Tokio官方教程有一个关于此主题的页面:Graceful shutdown