SHARE
TWEET

Untitled

a guest Apr 19th, 2019 93 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extern crate tokio; // 0.1.15
  2. extern crate futures; // 0.1.25
  3.  
  4. use futures::{Future, Stream};
  5.  
  6. fn main() {
  7.     let task = futures::future::ok(());
  8.    
  9.     // Таск спамит в консоль "interval N" каждую секунду
  10.     let interval_task = tokio::timer::Interval::new(std::time::Instant::now(), std::time::Duration::from_secs(1))
  11.         .map_err(|_| unreachable!())
  12.         .fold(0, |i, _| { println!("interval {}", i); Ok(i+1) });
  13.     let task = task.join(interval_task);
  14.            
  15.     // Таск спамит в консоль "repeat N" непрерывно
  16.     let repeat_task = futures::stream::repeat::<_, ()>(0)
  17.         .fold(0,|i, _| {
  18.             let task = futures::future::ok(()).and_then(move |_| Ok(i+1));
  19.            
  20.             // Использовать нулевую задержку посредством вызова Delay или нет
  21.             // Изменить для переключения режима
  22.             let repeat_with_delay = true;
  23.            
  24.             if !repeat_with_delay {
  25.                 // в этом варианте не используется нулевая задержка и, видимо,
  26.                 // основной цикл сообщений единожды войдя в код repeat_task будет бесконечно его выполнять
  27.                 // в связи с этим в консоли мы не увидим работу таска interval_task "interval N"
  28.                 // также код будет выполняться быстро, значение i очень велико, выводим в консоль с большим шагом
  29.                 if i % 1000000 == 0 { println!("repeat {}", i); };
  30.                 futures::future::Either::A( task )
  31.             } else {
  32.                 // в этом варианте используется нулевая задержка
  33.                 // каждый раз когда мы ее вызываем выполнение код таска прерывается и управление возвращается основному циклу сообщений
  34.                 // таким образом в консоли мы увидим работу таска interval_task "interval N"
  35.                 // код этого такска с нулевой задержкой будет вызываться сильно медленнее чем без нее, выводим в консоль лог с небольшим шагом
  36.                 if i % 100 == 0 { println!("repeat with delay {}", i); };
  37.                 let task_with_delay = tokio::timer::Delay::new(std::time::Instant::now() + std::time::Duration::from_secs(0))
  38.                     .map_err(|_| unimplemented!())
  39.                     .and_then(move |_| task );
  40.                 futures::future::Either::B( task_with_delay )
  41.             }
  42.         });
  43.     let task = task.join(repeat_task);
  44.    
  45.     // запускаем таски в одном потоке
  46.     let task = task.map(|_| ()).map_err(|_| ());
  47.     let mut rt = tokio::runtime::current_thread::Runtime::new().unwrap();
  48.     #[allow(unused_must_use)] { rt.block_on(task); }
  49. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top