我目前正在遍歷 IP 串列并檢查它們的內容:
if let Ok(lines) = read_lines(scan_file).await {
let stream = LinesStream::new(lines);
let client = Client::with_uri_str(mongodb_url.clone())
.await
.expect("Could not connect to MongoDB!");
stream
.map(|string| async {
if let Ok(iplong) = string {
let clone = iplong.clone();
let split: Vec<&str> = clone.split(" ").collect();
let ip = split.get(3);
if ip.is_some() {
check_server(ip.unwrap().to_string(), &client).await;
}
}
})
.buffer_unordered(1000)
.collect::<Vec<_>>()
.await;
}
(scan_file 包含從另一個工具獲得的許多 IP,這有點不方便,因為我只想能夠在不依賴其他任何東西的情況下運行我的工具。這也應該會大大減少運行時間,因為我不必等待一個工具完成以啟動我的工具。)但現在我想在不使用檔案或快取的情況下生成自己的 IP:
fn loop_ips() {
for i1 in 0..256 {
for i2 in 0..256 {
for i3 in 0..256 {
if is_public(i1, i2, i3) {
for i4 in 0..256 {}
}
}
}
}
}
(is_public 只是檢查它是否是公共 IP,所以我不檢查私有 IP)而且我想使用它們而不首先生成所有并存盤它們然后流過它們,但是使用流,因此嵌套的 for 回圈是異步流如上圖所示。我正在嘗試異步執行,因為請求需要一點時間,而乘以 IP 數量會需要很長時間,所以我想以某種方式回圈異步。
我還沒有嘗試過任何東西,因為我不知道該怎么做。我已經搜索了一個小時左右,我在多個 Discord 服務器上進行了詢問,但我沒有得到任何答案,所以我決定搬到這里。我真的不知道該解釋什么了,但是 SO 想要更多的非代碼文本。
uj5u.com熱心網友回復:
你可以試試async-stream板條箱。就像是:
fn loop_ips() -> impl Stream<Item = (u32,u32,u32,u32)>
{
stream! {
for i1 in 0..256 {
for i2 in 0..256 {
for i3 in 0..256 {
if is_public(i1, i2, i3) {
for i4 in 0..256 {
yield (i4, i3, i2, i1);
}
}
}
}
}
}
}
您也可以考慮rayon使用異步框架來代替。對于這些型別的并行性,有時更容易使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/523575.html
標籤:for循环异步锈溪流
上一篇:是否可以從SpringBoot中的模型類發送沒有一列或屬性的POST物件?
下一篇:如何執行代碼,同時承諾正在解決
