rust 'std::hread::sleep'位于异步方法内的忙碌循环内

jc3wubiy  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(95)

我有一个rust程序,其中我有一个方法定义在线程thread中,每24小时触发一次。主函数定义如下:

use tokio::task;

#[tokio::main]
async fn main() -> Result<String, String> {
   // spawing `trigger` in a separate thread
   task::spawn(async move {
        utilities::trigger().await
   });

   // other logic 
   Ok("Success".to_string())
}

utilities是一个crate,它定义了异步方法trigger,定义如下:-
utilities.rs

pub async trigger() {
 loop {
   // other logic
   // put the thread to sleep for 1 day
   std::thread::sleep(time::Duration::from_millis(86400000));
 }
}

上面的代码逻辑对我来说是有效的,但是我想知道是否有更好的方法来实现它。另外,我读到这个link,这个函数是阻塞的,不应该在异步函数中使用。有没有更好的方法来重写Rust中的trigger方法?

vxf3dgd4

vxf3dgd41#

时雄有自己的异步版本sleep,它不会阻塞线程,而只是让任务休眠,让线程可以自由处理其他任务。
此外,您还可以使用更复杂的调度箱,如cron

use chron::Schedule;
use chrono::Utc;
use std::str::FromStr;

// schedule task to run each day at midnight
let expr = "00 00 00 * * *";
let s = Schedule::from_str(expr).unwrap();

tokio::task::spawn(async move {
    loop {
        let next_execution = 
            s.upcoming(Utc).next().unwrap_or(Utc::now());

        let sleep_till = (next_execution - Utc::now())
            .to_std()
            .unwrap_or(Duration::ZERO);

         tokio::time::sleep(sleep_till).await;
         
         // your logic here
    }
});

相关问题