【问题标题】:How can I stop reading from a tokio::io::lines stream?如何停止从 tokio::io::lines 流中读取?
【发布时间】:2019-10-26 13:45:24
【问题描述】:

我想终止从tokio::io::lines 流中读取。我将它与 oneshot 未来合并并终止了它,但 tokio::run 仍在工作。

use futures::{sync::oneshot, *}; // 0.1.27
use std::{io::BufReader, time::Duration};
use tokio::prelude::*; // 0.1.21

fn main() {
    let (tx, rx) = oneshot::channel::<()>();
    let lines = tokio::io::lines(BufReader::new(tokio::io::stdin()));
    let lines = lines.for_each(|item| {
        println!("> {:?}", item);
        Ok(())
    });

    std::thread::spawn(move || {
        std::thread::sleep(Duration::from_millis(5000));
        println!("system shutting down");
        let _ = tx.send(());
    });

    let lines = lines.select2(rx);

    tokio::run(lines.map(|_| ()).map_err(|_| ()));
}

我怎样才能停止阅读这个?

【问题讨论】:

    标签: rust rust-tokio


    【解决方案1】:

    您的策略没有问题,但它只适用于不通过 Tokio 的 blocking 执行阻塞操作的期货(传统的阻塞类型 should never be done inside a future)。

    您可以通过将tokio::io::lines(..) 未来替换为简单的区间未来来测试:

    let lines = Interval::new(Instant::now(), Duration::from_secs(1));
    

    问题是 tokio::io::Stdin 内部使用 tokio_threadpool::blocking

    当您使用Tokio thread pool blocking(强调我的)时:

    注意:调用阻塞的整个任务都会被阻塞,只要 提供了闭包块,即使你使用了未来的组合器这样 as select - 此任务中的其他期货将不会取得进展 直到关闭返回。如果不希望这样做,请确保 blocking runs in its自己的任务(例如使用 futures::sync::oneshot::spawn)。

    由于这将阻塞组合器中的所有其他未来,因此您的 Receiver 将无法从 Sender 获得信号,直到阻塞结束。

    请参阅How can I read non-blocking from stdin? 或者您可以使用tokio-stdin-stdout,它创建一个通道来使用来自stdin 线程的数据。它还有一个逐行示例。

    【讨论】:

      【解决方案2】:

      感谢您的评论和纠正我的句子。

      我试图阻止这个非阻塞Future 并且成功了。

      let lines = Interval::new(Instant::now(), Duration::from_secs(1));
      

      我的理解是,在这种情况下,用 tokio threadpool::blocking 包裹阻塞 Future 会起作用。 我稍后再试试。

      非常感谢。

      【讨论】:

      • 其实这个想法是在 Future 内用 Tokio 的 Blocking 包装阻塞行为,否则不要在 Future 内使用它。只有知道你用 Tokio 的 Blocking 包装的闭包是允许无限期阻止,在你的情况下这就是 Stdin 所做的。
      • 非常感谢!既然我明白了自己的思维方式,我会多学习的。
      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 2022-01-09
      • 2017-08-23
      • 2013-02-13
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多