多队列的tokio有时会挂起,有时会起作用

时间:2018-12-10 18:04:58

标签: rust rust-tokio

我正在尝试使用tokio对板条箱multiqueue进行基准测试,以通过制作Stream可以迭代的方式来实现发布者/订阅者的行为。我对效率不满意(我可能需要数十或数百个侦听器来过滤项目,并且单个发布者每毫秒将发布大约10条消息),因此我想先对方法进行基准测试,然后再承诺它。但是,现在,我遇到了一个奇怪的错误,有时tokio::timer::Interval似乎根本没有触发。

完整代码如下:

#![feature(test)]

extern crate futures;
extern crate multiqueue;
extern crate test;
extern crate tokio;

#[cfg(test)]
mod tests {
    use super::*;
    use futures::future::lazy;
    use futures::sync::mpsc::{channel, Receiver, Sender};
    use futures::{Async, Poll, Stream};
    use futures::{Future, Sink};
    use test::Bencher;
    use tokio::timer::Interval;

    #[bench]
    fn bench_many(b: &mut Bencher) {
        tokio::run(lazy(|| {
            let (tx, rx) = multiqueue::mpmc_fut_queue(1000);
            tokio::spawn(
                Interval::new_interval(std::time::Duration::from_micros(100))
                    .take(100)
                    .map(|_| 100)
                    .map_err(|e| {
                        eprintln!("Got interval error = {:?}", e);
                    })
                    .fold(tx, |tx, num| {
                        println!("Sending {}", num);
                        tx.send(num).map_err(|e| println!("send err = {:?}", e))
                    })
                    .map(|_| ()),
            );

            for i in 0..3 {
                println!("Starting");
                let rx = rx.clone();
                tokio::spawn(rx.for_each(move |num| {
                    println!("{} Got a num! {}", i, num);
                    Ok(())
                }));
            }

            Ok(())
        }));
    }
}

,我正在使用cargo bench运行它。 futures在版本"0.1"上,tokio在版本"0.1"上,而multiqueue在版本"0.3"上。

有时,整个测试会以许多消息“ [0-2]有数字!100”和“发送100”完成,但是有时它会挂在中间(在多次“发送”和“获得”之后)消息)或挂起3条“开始”消息。

我怀疑这可能与我可以tokio同时运行的任务数量有关,但是我真的不明白为什么这会成为我同时遇到的局限性我频繁产生的任务类型会给执行者带来时间。

如何使它更可靠?

0 个答案:

没有答案