Si una app va creando muchos threads, cada uno puede tener 100kb de stack. Puede ser un problema la demanda de memoria.
Se puede usar Tareas asincrónicas de Rust para intercalar tareas en un único thread o en un pool de threads.
→ Se puede tener miles o decenas de miles en un programa.
El código asincrónico luce como el de threads, salvo que las operaciones que bloquean, se manejan diferente.
No son administrados por el scheduler, sino por un executor.
use std::{ net, thread };
// Passive server socket
let listener = net::TcpListener::bind(address)?;
// Block the thread until a connection is received
for socket_result in listener.incoming() {
let socket = socket_result?; // Socket connected with the client
let groups = chat_group_table.clone();
thread::spawn(|| {
// Create the thread with spawn per client
log_error(serve(socket, groups));
});
}
Es muy similar al sincrónico pero pongo await en las operaciones que son bloqueantes.
Le indico a la tarea que cuando se bloquea puede encargarse de hacer otra cosa mientras.
use async_std::{net, task};
let listener = net::TcpListener::bind(address).await?;
let mut new_connections = listener.incoming();
while let Some(socket_result) = new_connections.next().await {
let socket = socket_result?;
let groups = chat_group_table.clone();
task::spawn(async {
log_error(serve(socket, groups).await);
});
}