Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate tokio; // 0.1.15
- extern crate futures; // 0.1.25
- use futures::{Future, Stream};
- fn main() {
- let task = futures::future::ok(());
- // Таск спамит в консоль "interval N" каждую секунду
- let interval_task = tokio::timer::Interval::new(std::time::Instant::now(), std::time::Duration::from_secs(1))
- .map_err(|_| unreachable!())
- .fold(0, |i, _| { println!("interval {}", i); Ok(i+1) });
- let task = task.join(interval_task);
- // Таск спамит в консоль "repeat N" непрерывно
- let repeat_task = futures::stream::repeat::<_, ()>(0)
- .fold(0,|i, _| {
- let task = futures::future::ok(()).and_then(move |_| Ok(i+1));
- // Использовать нулевую задержку посредством вызова Delay или нет
- // Изменить для переключения режима
- let repeat_with_delay = true;
- if !repeat_with_delay {
- // в этом варианте не используется нулевая задержка и, видимо,
- // основной цикл сообщений единожды войдя в код repeat_task будет бесконечно его выполнять
- // в связи с этим в консоли мы не увидим работу таска interval_task "interval N"
- // также код будет выполняться быстро, значение i очень велико, выводим в консоль с большим шагом
- if i % 1000000 == 0 { println!("repeat {}", i); };
- futures::future::Either::A( task )
- } else {
- // в этом варианте используется нулевая задержка
- // каждый раз когда мы ее вызываем выполнение код таска прерывается и управление возвращается основному циклу сообщений
- // таким образом в консоли мы увидим работу таска interval_task "interval N"
- // код этого такска с нулевой задержкой будет вызываться сильно медленнее чем без нее, выводим в консоль лог с небольшим шагом
- if i % 100 == 0 { println!("repeat with delay {}", i); };
- let task_with_delay = tokio::timer::Delay::new(std::time::Instant::now() + std::time::Duration::from_secs(0))
- .map_err(|_| unimplemented!())
- .and_then(move |_| task );
- futures::future::Either::B( task_with_delay )
- }
- });
- let task = task.join(repeat_task);
- // запускаем таски в одном потоке
- let task = task.map(|_| ()).map_err(|_| ());
- let mut rt = tokio::runtime::current_thread::Runtime::new().unwrap();
- #[allow(unused_must_use)] { rt.block_on(task); }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement