I/O vs CPU-intensive tasks
As you know now, what you normally write are called non-leaf futures. Let’s take a look at this async
block using pseudo-Rust as an example:
let non_leaf = async { let mut stream = TcpStream::connect("127.0.0.1:3000").await.unwrap(); // request a large dataset let result = stream.write(get_dataset_request).await.unwrap(); // wait for the dataset let mut response = vec![]; stream.read(&mut response).await.unwrap(); // do some CPU-intensive analysis on the dataset let report = analyzer::analyze_data(response).unwrap(); // send the results back stream.write(report).await.unwrap(); };
I’ve highlighted the points where we yield control to the runtime executor. It’s important to be aware...