Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement