asyncfn handle_request( mut request: Request<RecvStream>, mut respond: SendResponse<Bytes>,
) -> Result<(), Box<dyn Error + Send + Sync>> { let body = request.body_mut(); whilelet Some(data) = body.data().await { let data = data?; let _ = body.flow_control().release_capacity(data.len());
} let response = http::Response::new(()); letmut send = respond.send_response(response, false)?;
send.send_data(Bytes::from_static(b"pong"), true)?;
Ok(())
}
// The benchmark asyncfn send_requests(addr: &str) -> Result<(), Box<dyn Error>> { let tcp = loop { let Ok(tcp) = TcpStream::connect(addr).awaitelse { continue;
}; break tcp;
}; let (client, h2) = client::handshake(tcp).await?; // Spawn a task to run the conn...
tokio::spawn(asyncmove { iflet Err(e) = h2.await {
println!("GOT ERR={:?}", e);
}
});
letmut handles = Vec::with_capacity(NUM_REQUESTS_TO_SEND); for _i in0..NUM_REQUESTS_TO_SEND { letmut client = client.clone(); let task = tokio::spawn(asyncmove { let request = Request::builder().body(()).unwrap();
let instant = Instant::now(); let (response, _) = client.send_request(request, true).unwrap(); let response = response.await.unwrap(); letmut body = response.into_body(); whilelet Some(_chunk) = body.data().await {}
instant.elapsed()
});
handles.push(task);
}
let instant = Instant::now(); letmut result = Vec::with_capacity(NUM_REQUESTS_TO_SEND); for handle in handles {
result.push(handle.await.unwrap());
} letmut sum = Duration::new(0, 0); for r in result.iter() {
sum = sum.checked_add(*r).unwrap();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.