paranid5

tokio handler example

Jul 11th, 2022 (edited)
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.23 KB | None | 0 0
  1. pub struct TokioHandler {
  2.     rt: Runtime // tokio runtime
  3. }
  4.  
  5. static mut TOKIO_HANDLER = Lazy::new(|| Arc::new(RWLock::new(TokioHandler::new()) // из крейта once_cell
  6.  
  7. impl TokioHandler {
  8.     fn new() -> Self {
  9.         Self {
  10.             rt: tokio::runtime::Builder::new_current_thread()
  11.                 .enable_all()
  12.                 .build()
  13.                 .unwrap()
  14.         }
  15.     }
  16.    
  17.     pub fn launch_main_task<F: Future + Send + 'static>(&self, async_main_fn: F) -> F::Output {
  18.         self.rt.block_on(async_main_fn)
  19.    }
  20.  
  21.    pub fn launch_task<F: Future + Send + 'static>(&self, task: F) -> JoinHandle<F::Output> {
  22.         self.rt.spawn(task)
  23.     }
  24. }
  25.    
  26. // Пример
  27.  
  28. fn start_program() {
  29.     let handler_clone = TOKIO_HANDLER.clone(); // клонируем ссылку, чтобы отправить в поток
  30.    
  31.     unsafe {
  32.         TOKIO_HANDLER.read().unwrap().launch_main_task(async move {
  33.             let handle = handler_clone.read().unwrap().launch_task(async { get_data(); }); // выполняется в другом потоке
  34.             let data: Data = handle.await; // не блокирует потоки, только корутину
  35.             // ...
  36.         })
  37.     }
  38. }    
  39.  
  40. fn get_data() -> Data {
  41.     // ...
  42. }
Add Comment
Please, Sign In to add comment