Concurrencia y async
15 pasos en 5 series de Rust.
La promesa de Rust sobre concurrencia es más fuerte que su promesa sobre memoria: las carreras de datos son un error de compilación, no una sesión de depuración. Primero hilos, luego estado compartido con Arc y Mutex, después canales.
La última serie es async con tokio, que es otro modelo distinto y conviene mantenerlo separado en tu cabeza. Quince pasos, y aquí el compilador hace más por ti que en ninguna otra parte del lenguaje.
Hilos
- Crear hilosspawn arranca un hilo y devuelve un handle; join espera y recoge su valor.
- Closures moveUn hilo sobrevive al marco de pila de quien llama; debe ser dueño de lo que captura.
- Hilos con scopethread::scope deja que los hilos presten datos locales: no pueden sobrevivir al scope.
Canales
- Canalesmpsc mueve valores entre hilos: muchos emisores, un receptor.
- Un pool de workersTrabajos por un canal, resultados de vuelta por otro — un pool en veinte líneas.
Async con tokio
- async y awaitUna async fn devuelve un futuro: nada corre hasta que un runtime lo sondea.
- Lanzar tareastokio::spawn entrega un futuro al runtime y devuelve un JoinHandle.
- Correr futuros juntosjoin! espera varios futuros a la vez; try_join! abandona en el primer error.
- select! y timeoutsselect! toma el primer futuro que termine — la forma de todo timeout.
- Canales asyncEl mpsc de tokio es el gemelo async del canal de std: send y recv hacen await.
- Sostener un lock a través de un awaitEl Mutex de tokio puede sostenerse a través de un await; el de std, no.
Bis
- parallel_sum.rsRepartir una suma grande entre hilos y comparar contra la respuesta en serie.