这是我的代码:
use std::net;
use std::thread;
fn scan_port(host: &str, port: u16) -> bool {
let host = host.to_string();
let port = port;
let t = thread::spawn(move || net::TcpStream::connect((host.as_str(), port)).is_ok());
t.join().unwrap()
}
如果连接未在 N 秒内完成,如何创建线程将被终止或杀死的情况?
所有这一切的原因是 Rust 无法设置套接字连接超时,所以我无法确保程序不会卡住。
最佳答案
正如@Shepmaster 指出的那样:终止线程不是一个好主意。
你可以做的是给线程一个 Sender
如果它已成功打开连接,它应该通过它通知您(甚至可能通过向您发送句柄)。然后你可以让你的主线程sleep
在你希望等待的时间。当您的线程醒来时,它会检查其对应的 Receiver
从线程中获取一些生命迹象。万一线程没有回答,只是release it into the wild by dropping the JoinHandle
和 Receiver
。它不像是在消耗 cpu 时间(它被阻塞),也没有消耗太多内存。如果它解除阻止,它会检测到 Sender
未连接并且可以永久关闭。
当然,您不应该拥有数以亿计的这些开放线程,因为它们仍在使用资源(内存和系统线程句柄),但在普通系统上这不是什么大问题。
例子:
use std::net;
use std::thread;
use std::sync::mpsc;
fn scan_port(host: &str, port: u16) -> bool {
let host = host.to_string();
let port = port;
let (sender, receiver) = mpsc::channel();
let t = thread::spawn(move || {
match sender.send(net::TcpStream::connect((host.as_str(), port))) {
Ok(()) => {}, // everything good
Err(_) => {}, // we have been released, don't panic
}
});
thread::sleep(std::time::Duration::new(5, 0));
match receiver.try_recv() {
Ok(Ok(handle)) => true, // we have a connection
Ok(Err(_)) => false, // connecting failed
Err(mpsc::TryRecvError::Empty) => {
drop(receiver);
drop(t);
// connecting took more than 5 seconds
false
},
Err(mpsc::TryRecvError::Disconnected) => unreachable!(),
}
}
关于multithreading - Rust 中为线程或函数创建超时的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181719/