programmazione:rust:appunti_sparsi
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| programmazione:rust:appunti_sparsi [08/05/2026 13:53] – Fabio Di Matteo | programmazione:rust:appunti_sparsi [30/05/2026 15:51] (versione attuale) – [Funzioni async con tokio] Fabio Di Matteo | ||
|---|---|---|---|
| Linea 248: | Linea 248: | ||
| * [[programmazione: | * [[programmazione: | ||
| + | * [[programmazione: | ||
| + | * [[https:// | ||
| ===== I thread ===== | ===== I thread ===== | ||
| Linea 285: | Linea 287: | ||
| La condivisione è sicura. Potremmo anche condividere **mpsc:: | La condivisione è sicura. Potremmo anche condividere **mpsc:: | ||
| + | |||
| + | ===== Funzioni async con tokio ===== | ||
| + | Eseguire funzioni che richiedono tempo con il runtime tokio: | ||
| + | <code rust> | ||
| + | use tokio:: | ||
| + | |||
| + | async fn asincrona() { | ||
| + | sleep(Duration:: | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | # | ||
| + | async fn main() { | ||
| + | // Avvio una funzione async con tokio e passo il controllo | ||
| + | // alle istruzioni successive | ||
| + | tokio:: | ||
| + | |||
| + | println!(" | ||
| + | sleep(Duration:: | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | Aspettiamo che una funzione, | ||
| + | |||
| + | <code rust> | ||
| + | use tokio:: | ||
| + | |||
| + | async fn asincrona() -> i32 { | ||
| + | sleep(Duration:: | ||
| + | println!(" | ||
| + | return 6000; | ||
| + | } | ||
| + | |||
| + | # | ||
| + | async fn main() { | ||
| + | // Avvio una funzione async con tokio e passo il controllo | ||
| + | // alle istruzioni successive. | ||
| + | let r = tokio:: | ||
| + | |||
| + | // Scrivo qualcosa dal main e dopo un secondo il programma dovrebbe terminare | ||
| + | // Invece no! Aspetto il valore di " | ||
| + | // r.await | ||
| + | println!(" | ||
| + | sleep(Duration:: | ||
| + | |||
| + | // Ora che il valore di " | ||
| + | // oppure stampo " | ||
| + | println!( | ||
| + | "Ho aspettato il valore di r {}", | ||
| + | r.await.unwrap_or_else(|_| 0) | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Comunicare con le funzioni async ===== | ||
| + | <code rust> | ||
| + | use std:: | ||
| + | use tokio:: | ||
| + | |||
| + | async fn asincrona(t: | ||
| + | loop { | ||
| + | t.send(" | ||
| + | sleep(Duration:: | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # | ||
| + | async fn main() { | ||
| + | let (tx, rx) = mpsc:: | ||
| + | |||
| + | let tx_clone = tx.clone(); | ||
| + | tokio:: | ||
| + | |||
| + | // Un loop che riceve messaggi dalla funzione asincrona e | ||
| + | // li stampa a video. | ||
| + | loop { | ||
| + | sleep(Duration:: | ||
| + | let val = rx.recv().unwrap_or_else(|_| " | ||
| + | println!(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| Linea 385: | Linea 473: | ||
| fn main() { | fn main() { | ||
| + | // Utilizzarla senza controllo errori così: | ||
| + | // let myexe_path = exe_dir(); | ||
| + | // println!( | ||
| + | // " | ||
| + | // | ||
| + | // ); | ||
| + | |||
| let myexe_path = exe_dir(); | let myexe_path = exe_dir(); | ||
| - | println!( | + | |
| - | "Il percorso del mio eseguibile: {}", | + | Ok(p) => { |
| - | | + | |
| - | ); | + | "Il percorso del mio eseguibile |
| + | p.display().to_string() | ||
| + | ); | ||
| + | } | ||
| + | Err(e) => { | ||
| + | eprintln!(" | ||
| + | } | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
programmazione/rust/appunti_sparsi.1778241238.txt.gz · Ultima modifica: 08/05/2026 13:53 da Fabio Di Matteo
