这似乎是锈一个常见的成语产卵关闭一个线程阻塞的IO,所以你可以使用非阻塞渠道:如何可靠地清理阻塞IO的锈线程?
use std::sync::mpsc::channel;
use std::thread;
use std::net::TcpListener;
fn main() {
let (accept_tx, accept_rx) = channel();
let listener_thread = thread::spawn(move || {
let listener = TcpListener::bind(":::0").unwrap();
for client in listener.incoming() {
if let Err(_) = accept_tx.send(client.unwrap()) {
break;
}
}
});
}
的问题是,再结合这样的线程取决于产生的线程上“实现通过克隆
drop(accept_rx);
listener_thread.join(); // blocks until listener thread reaches accept_tx.send(..)
你可以让虚拟连接的TcpListener
秒,关机TcpStream
S,但这些看起来像真的哈克:“信道的接收端已被删除(即调用send(..)
回报Err(_)
)清理这种方法的方法读取,并且就目前而言,我甚至不知道的破解在从stdin
的读取中触发线程阻塞加入。
我该如何清理这些线程,还是我的架构错了?
无法立即可靠地清理线程的一般模式是通知它们清理,让它们运行并确保它们不再产生副作用。对于不可接受的TcpListener,但对于传出请求或文件操作,通常是这样。 – usr
@usr好的,但我正在寻找Rust解决方案。 (我猜,它不需要完全适合那个模具。)我问这个问题,因为我一直无法找到使用当前(安全)API的方式。 – sleeparrow
http://www.rust-lang.org/ – sleeparrow