我正在使用 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/