rust - 读取两个阻塞迭代器

标签 rust

我正在使用 Rust websocket library与事物交谈,我有一个大致如下所示的线程:

thread::spawn(move || {
    while let Ok(Message::Text(text)) = receiver.recv_message() {
        /* Do some stuff */
    }
});

上面的接收器也可以是一个阻塞迭代器:

thread::spawn(move || {
    for message in receiver.incoming_messages() {
        /* Do same stuff */
    }
});

我想向这个线程发送一个信号,告诉它停止做事。我认为 mpsc::channel 非常适合这种信号发送。 select!似乎是要走的路,但它只有在所有 channel 都是 mpsc::channel 类型时才有效。

有什么东西可以连接两个阻塞迭代器并在数据传入时提供输出吗?或者这个问题的任何其他解决方案?我想避免为每个输入源创建一个线程并管理我自己的队列。

最佳答案

Is there something that can join two blocking iterators and provide output as data comes in? Or any other solution to this issue?

虽然我当然希望有人能证明我是错的,但我认为答案必须是“不”。根据定义,阻塞的东西将阻止在该线程上完成任何进一步的工作。您需要能够区分“完成”、“无可读”和“有东西可读”状态的东西,并且不能构建在仅提供其中两种状态的构建 block 之上。

I'd like to avoid creating a thread for each source of input and managing my own queue.

我看不出有什么办法解决这个问题。由于阻塞迭代器阻塞线程,拥有多个线程允许您添加回“无可读”的状态。

更好的解决方案是让两个输入源都具有所有 3 种状态。

loop {
    if let Ok(Message::Text(text)) = receiver.recv_message() {
        // Do some stuff
    } else if let Err(TryRecvError::Disconnected) = kill.try_recv() {
        break;
    } else {
        // Something intelligent for the other cases?
    }
}

关于rust - 读取两个阻塞迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32448623/

相关文章:

rust - 借指针错误递归遍历树

python - 使用 PyO3 和 Maturin 交叉编译(unixlike 到 windows)

rust - 使用 Neon 与 Wasm 编写 Node.js 模块之间的技术差异是什么?

reference - 迭代器通过引用返回项目,生命周期问题

rust - 拆分字符串并保留分隔符

hashmap - 是否可以创建一个由 `HashMap` 类型的键控的 `*const Any` ?

rust - 写入 MaybeUninit 结构中的字段?

logging - 如何在Rust中将自定义数据传递到日志箱的宏?

windows - Windows上CLion的Rust标准库位置的路径是什么?

rust - Trait 对象的方法,它接受多种数字类型