多线程 – Rust为线程或函数创建超时的正确方法是什么?
发布时间:2020-07-09 01:53:54 所属栏目:Java 来源:互联网
导读:这是我的代码: use std::net;use std::thread;extern crate argparse;use argparse::{ArgumentParser, StoreTrue, Store};fn scan_port(host: str, port: u16) - bool { let host = host.to_string(); let
|
这是我的代码: use std::net;
use std::thread;
extern crate argparse;
use argparse::{ArgumentParser,StoreTrue,Store};
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所说:终止线程是个坏主意.你可以做的是给线程一个 当然你不应该有这些开放线程的bazillions,因为它们仍然使用资源(内存和系统线程句柄),但在正常的系统上,这不是一个问题. 例: 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!(),}
} (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
