在tokio::spawn中起了一个新协程,然后在代码中执行sleep死循环,发现程序运行时,主线程中无法通过ctrl+c终止进程。代码如下
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// 解析命令行参数
let args = Arguments::parse();
if args.version {
print_ver();
return Ok(());
}
// 初始化摄像头
spawn(async move {
info!("camera capture started");
camera_capture().await;
});
let c = config::get_config();
let listen = c.tlps.as_ref().unwrap().listen.as_ref().unwrap();
println!("listen http://{}", listen);
HttpServer::new(|| {
App::new().service(camera_settings).service(
SwaggerUi::new("/swagger-ui/{_:.*}").url("/api-docs/openapi.json", ApiDoc::openapi()),
)
})
.bind(listen)?
.run()
.await
}
async fn camera_capture() {
let tlps_cfg = config::get_config().tlps.as_ref().unwrap();
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
print_ver();
}
}
现象,在终端中按下Ctrl+C
无法退出进程,如下
最后发现原因是tokio
拉起的线程(协程)中不能使用std::thread
的sleep
方法进行休眠,而是应该使用tokio
的sleep
方法休眠。我这里是actix-web
,虽然它是基于tokio
的,但是,他也有对应的sleep
方法,应该改为如下方式
loop {
actix_web::rt::time::sleep(std::time::Duration::from_secs(1)).await;
print_ver();
}
再使用ctrl-c,能够正常终止进程了。