La programación asincrónica es un concepto importante que debe tener en cuenta como desarrollador de Rust.

Los modelos de programación síncrona tradicionales a menudo conducen a cuellos de botella en el rendimiento. Esto se debe a que el programa espera a que se completen las operaciones lentas antes de pasar a la siguiente tarea. Esto a menudo da como resultado un uso deficiente de los recursos y una experiencia de usuario lenta.

La programación asincrónica le permite escribir código sin bloqueo que utiliza los recursos del sistema de manera efectiva. Al aprovechar la programación asíncrona, puede diseñar aplicaciones que realicen múltiples tareas. La programación asíncrona es útil para manejar varias solicitudes de red o procesar grandes cantidades de datos sin bloquear el flujo de ejecución.

Programación asíncrona en Rust

El modelo de programación asincrónica de Rust le permite escribir código Rust eficiente que se ejecute simultáneamente sin bloquear el flujo de ejecución. La programación asíncrona es beneficiosa cuando se trata de operaciones de E/S, solicitudes de red y tareas que implican la espera de recursos externos.

instagram viewer

Puede implementar la programación asíncrona en sus aplicaciones de Rust de varias maneras. Estos incluyen funciones de idioma, bibliotecas y el tiempo de ejecución de Tokio.

También, Modelo de propiedad de Rust y las primitivas de concurrencia como canales y bloqueos permiten una programación concurrente segura y eficiente. Puede aprovechar estas funciones con la programación asincrónica para crear sistemas simultáneos que se escalen bien y utilicen varios núcleos de CPU.

Conceptos de programación asíncrona de Rust

Los futuros proporcionan una base para la programación asíncrona en Rust. Un futuro representa un cálculo asíncrono que no se ha ejecutado por completo.

Los futuros son perezosos (solo se ejecutan cuando se realizan encuestas). Cuando llamas a un futuro encuesta() método, comprueba si el futuro se ha completado o necesita trabajo adicional. Si el futuro no está listo, vuelve Encuesta:: Pendiente, lo que indica que la tarea debe programarse para su posterior ejecución. Si el futuro está listo, vuelve Encuesta:: Listo con el valor resultante.

La cadena de herramientas estándar de Rust incluye primitivas de E/S asíncronas, una versión asíncrona de E/S de archivos, redes y temporizadores. Estas primitivas le permiten realizar operaciones de E/S de forma asíncrona. Esto ayuda a evitar bloquear la ejecución de un programa mientras se espera que se completen las tareas de E/S.

La sintaxis async/await le permite escribir código asíncrono que se parece al código síncrono. Esto hace que su código sea intuitivo y fácil de mantener.

El enfoque de Rust para la programación asincrónica enfatiza la seguridad y el rendimiento. Las reglas de propiedad y préstamo garantizan la seguridad de la memoria y evitan problemas comunes de simultaneidad. La sintaxis asíncrona/en espera y los futuros proporcionan una forma intuitiva de expresar flujos de trabajo asíncronos. Puede usar un tiempo de ejecución de terceros para administrar tareas para una ejecución eficiente.

Puede combinar estas funciones de lenguaje, bibliotecas y tiempo de ejecución para escribir código de alto rendimiento. Proporciona un marco poderoso y ergonómico para construir sistemas asíncronos. Esto convierte a Rust en una opción popular para proyectos que requieren un manejo eficiente de tareas vinculadas a E/S y alta simultaneidad.

Rust versión 1.39 y versiones posteriores no admiten operaciones asincrónicas en la biblioteca estándar de Rust. Necesitará una caja de terceros para usar el asíncrono/esperar sintaxis para manejar operaciones asincrónicas en Rust. Puede utilizar paquetes de terceros como Tokio o asíncrono estándar para trabajar con la sintaxis async/await.

Programación asíncrona con Tokio

Tokio es un tiempo de ejecución asíncrono robusto para Rust. Proporciona funcionalidad para crear aplicaciones escalables y de alto rendimiento. Puedes aprovechar el poder de la programación asíncrona con Tokio. También proporciona características para la extensibilidad.

En el núcleo de Tokio se encuentra su modelo de ejecución y programación de tareas asincrónicas. Tokio te permite escribir código asíncrono con la sintaxis async/await. Esto permite la utilización eficiente de los recursos del sistema y la ejecución simultánea de tareas. El ciclo de eventos de Tokio administra eficientemente la programación de tareas. Esto asegura la utilización óptima de los núcleos de la CPU y minimiza la sobrecarga de cambio de contexto.

Los combinadores de Tokio facilitan la coordinación y composición de tareas. Tokio proporciona poderosas herramientas de composición y coordinación de tareas. Puede esperar a que se completen varias tareas con unirse, seleccionar la primera tarea completada con seleccionar y competir entre sí con carrera.

Añade el tokio caja a su Cargo.toml sección de dependencias del archivo.

[dependencies]
tokio = { version = "1.9", features = ["full"] }

Así es como puede usar la sintaxis async/await en sus programas Rust con Tokio:

use tokio:: time:: sleep;
use std:: time:: Duration;

asyncfnhello_world() {
println!("Hello, ");
sleep(Duration:: from_secs(1)).await;
println!("World!");
}

#[tokio:: main]
asyncfnmain() {
hello_world().await;
}

El Hola Mundo La función es asíncrona, por lo que puede usar el esperar palabra clave para pausar su ejecución hasta que se resuelva un futuro. El Hola Mundo huellas de funciones "Hola, " a la consola El Duración:: from_secs (1) La llamada a la función suspende la ejecución de la función por un segundo. El esperar la palabra clave espera a que se complete el futuro de suspensión. Finalmente, el Hola Mundo huellas de funciones "¡Mundo!" a la consola

El principal La función es una función asíncrona con el #[tokio:: principal] atributo. Designa la función principal como el punto de entrada para el tiempo de ejecución de Tokio. El hola_mundo().esperar ejecuta la función hello_world de forma asíncrona.

Retrasando tareas con Tokio

Una tarea predominante en la programación asincrónica es usar retrasos o programar tareas para ejecutarlas en un rango de tiempo específico. tokio runtime proporciona un mecanismo para usar temporizadores asíncronos y retrasos a través del tokio:: tiempo módulo.

Así es como puede retrasar una operación con el tiempo de ejecución de Tokio:

use std:: time:: Duration;
use tokio:: time:: sleep;

asyncfndelayed_operation() {
println!("Performing delayed operation...");
sleep(Duration:: from_secs(2)).await;
println!("Delayed operation completed.");
}

#[tokio:: main]
asyncfnmain() {
println!("Starting...");
delayed_operation().await;
println!("Finished.");
}

El operación_retrasada función introduce un retraso de dos segundos con el dormir método. El operación_retrasada La función es asíncrona, por lo que puede usar await para pausar su ejecución hasta que se complete el retraso.

Manejo de errores en programas asincrónicos

El manejo de errores en el código Rust asíncrono implica usar el Resultado tipo y manejo de errores de Rust con el ? operador.

use tokio:: fs:: File;
use tokio:: io;
use tokio:: io::{AsyncReadExt};

asyncfnread_file_contents() -> io::Result<String> {
letmut file = File:: open("file.txt").await?;
letmut contents = String::new();
file.read_to_string(&mut contents).await?;
Ok(contents)
}

asyncfnprocess_file() -> io::Result {
let contents = read_file_contents().await?;
// Process the file contents
Ok(())
}

#[tokio:: main]
asyncfnmain() {
match process_file().await {
Ok(()) => println!("File processed successfully."),
Err(err) => eprintln!("Error processing file: {}", err),
}
}

El leer_archivo_contenido función devuelve un io:: Resultado que representa la posibilidad de un error de E/S. Al usar el ? operador después de cada operación asíncrona, el tiempo de ejecución de Tokio propagará errores en la pila de llamadas.

El principal La función maneja el resultado con un fósforo declaración que imprime un texto basado en el resultado de la operación.

Reqwest utiliza programación asíncrona para operaciones HTTP

Muchas cajas populares, incluido Reqwest, usan Tokio para proporcionar operaciones HTTP asíncronas.

Puede usar Tokio con Reqwest para realizar varias solicitudes HTTP sin bloquear otras tareas. Tokio puede ayudarlo a manejar miles de conexiones simultáneas y administrar recursos de manera eficiente.