我正在编写一个程序,它使用 ssh 在服务器上执行命令并获取输出。
我不明白的部分在代码中较低。
如果函数等待然后返回一个字符串,它会按预期工作,但如果使用 TCP,它会开始表现得很糟糕。我希望在 100 台主机上使用 100 个线程的速度会提高 100 倍,因为会同时打开 100 个套接字。
在睡眠版本中,更改poolThreads
直接影响执行时间。在带有 TCP 流的版本中,pool
从 1 更改为 100 有 100 个主机只会将其从 90 加速到 67,因为某些主机处于脱机状态。
我阅读了文档,但找不到任何可以帮助我的东西。
use clap::{App, Arg};
use rayon::prelude::*;
use rayon::ThreadPoolBuilder;
use ssh2::Session;
use std::fmt::Display;
use std::io::prelude::*;
use std::io::{BufReader, Read};
use std::net::{TcpStream, ToSocketAddrs};
use std::thread::sleep;
use std::time::Duration;
fn process_host<A>(hostname: A) -> Result<String, String>
where
A: ToSocketAddrs + Display,
{
sleep(Duration::from_secs(1));
return Ok(hostname.to_string());
// here is the problem
// -----------------------------------------------------------
let tcp = match TcpStream::connect(&hostname) {
Ok(a) => a,
Err(e) => {
return Err(format!("{}:{}", hostname, e).to_string());
}
};
let mut sess = match Session::new() {
Ok(a) => a,
Err(e) => {
// todo logging
return Err(format!("{}:{}", hostname, e).to_string());
}
};
sess.set_tcp_stream(tcp);
match sess.handshake() {
Ok(a) => a,
Err(e) => {
return Err(format!("{}:{}", hostname, e).to_string());
}
};
Ok(format!("{}", hostname))
}
fn main() {
let hosts = vec!["aaaaa:22", "bbbbbbb:22"];
let pool = ThreadPoolBuilder::new()
.num_threads(10)
.build()
.expect("failed creating pool");
pool.install(|| {
hosts
.par_iter()
.map(|x| process_host(x))
.for_each(|x| println!("{:?}", x))
});
}