初学rust,tokio::spawn中loop-sleep无法使用ctrl+c终止进程的原因
Tag tokio, ctrl-c, 终止进程, on by view 8

在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无法退出进程,如下

hg6ndsox

最后发现原因是tokio拉起的线程(协程)中不能使用std::threadsleep方法进行休眠,而是应该使用tokiosleep方法休眠。我这里是actix-web,虽然它是基于tokio的,但是,他也有对应的sleep方法,应该改为如下方式

loop {
    actix_web::rt::time::sleep(std::time::Duration::from_secs(1)).await;
    print_ver();
}

再使用ctrl-c,能够正常终止进程了。