Увод у асинхроно програмирање у Русту

Традиционални модели синхроног програмирања често доводе до уских грла у перформансама. То је зато што програм чека да се споре операције заврше пре него што пређе на следећи задатак. Ово често резултира лошом употребом ресурса и спорим корисничким искуством.

Асинхроно програмирање вам омогућава да пишете неблокирајући код који ефикасно користи системске ресурсе. Коришћењем асинхроног програмирања, можете дизајнирати апликације које обављају више задатака. Асинхроно програмирање је згодно за руковање неколико мрежних захтева или обраду великих количина података без блокирања тока извршења.

Асинхроно програмирање у Русту

Руст-ов асинхрони модел програмирања вам омогућава да напишете ефикасан Руст код који се покреће истовремено без блокирања тока извршавања. Асинхроно програмирање је корисно када се ради са И/О операцијама, мрежним захтевима и задацима који укључују чекање на спољне ресурсе.

Асинхроно програмирање можете имплементирати у своје Руст апликације на неколико начина. То укључује језичке карактеристике, библиотеке и Токио рунтиме.

Такође, Рустов модел власништва и паралелни примитиви као што су канали и браве омогућавају сигурно и ефикасно истовремено програмирање. Ове функције можете искористити асинхроним програмирањем да бисте изградили истовремене системе који се добро скалирају и користе више ЦПУ језгара.

Руст-ови концепти асинхроног програмирања

Будућност пружа основу за асинхроно програмирање у Русту. Будућност представља асинхроно израчунавање које није у потпуности извршено.

Фјучерси су лењи (они се извршавају само када су на гласању). Када позовете метод футуре полл(), он проверава да ли је будућност завршена или је потребан додатни рад. Ако будућност није спремна, враћа Полл::Пендинг, што указује да задатак треба заказати за касније извршење. Ако је будућност спремна, враћа Полл::Реади са резултујућом вредношћу.

Руст-ов стандардни ланац алата укључује асинхроне И/О примитиве, асинхрону верзију У/И датотека, умрежавање и тајмере. Ови примитиви вам омогућавају да изводите И/О операције асинхроно. Ово помаже да се избегне блокирање извршавања програма док се чека да се заврше И/О задаци.

Синтакса асинц/аваит вам омогућава да пишете асинхрони код који изгледа слично синхроном коду. Ово чини ваш код интуитивним и лаким за одржавање.

Рустов приступ асинхроном програмирању наглашава безбедност и перформансе. Правила о власништву и позајмљивању обезбеђују сигурност меморије и спречавају уобичајене проблеме истовремености. Синтакса Асинц/аваит и будућност пружају интуитиван начин за изражавање асинхроних токова посла. За управљање задацима за ефикасно извршење можете да користите рунтиме треће стране.

Можете комбиновати ове језичке карактеристике, библиотеке и време извођења да бисте написали код са високим перформансама. Пружа моћан и ергономски оквир за изградњу асинхроних система. Ово чини Руст популарним избором за пројекте који захтевају ефикасно руковање задацима везаним за У/И и високу конкурентност.

Руст верзија 1.39 и новије верзије не подржавају асинхроне операције у Руст стандардној библиотеци. Требаће вам сандук треће стране да бисте користили синтаксу асинц/аваит за руковање асинхроним операцијама у Русту. Можете да користите пакете независних произвођача као што су Токио или асинц-стд за рад са синтаксом асинц/аваит.

Асинхроно програмирање са Токиом

Токио је робусно асинхроно време извођења за Руст. Пружа функционалност за изградњу високоучинковитих и скалабилних апликација. Можете искористити моћ асинхроног програмирања са Токиом. Такође пружа функције за проширивост.

У основи Токија је његов модел асинхроног планирања и извршавања задатака. Токио вам омогућава да пишете асинхрони код са синтаксом асинц/аваит. Ово омогућава ефикасно коришћење системских ресурса и истовремено извршавање задатака. Токиова петља догађаја ефикасно управља заказивањем задатака. Ово обезбеђује оптимално коришћење ЦПУ језгара и минимизира трошкове промене контекста.

Токио комбинатори чине координацију задатака и састављање лаким. Токио пружа моћне алате за координацију задатака и састављање. Можете сачекати да се више задатака заврши са спајањем, изаберите први завршени задатак са одабиром и тркајте се задатака један против другог трком.

Додајте токио сандук у одељак зависности ваше датотеке Царго.томл.

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

Ево како можете да користите синтаксу асинц/аваит у својим Руст програмима са Токиом:

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

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

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

Функција хелло_ворлд је асинхрона, тако да може да користи кључну реч аваит да паузира своје извршавање док се будућност не реши. Функција хелло_ворлд штампа „Здраво,“ на конзоли. Позив функције Дуратион::фром_сецс(1) суспендује извршење функције на секунду. Кључна реч аваит чека да се заврши будућност спавања. Коначно, функција хелло_ворлд штампа „Свет!“ на конзолу.

Главна функција је асинхрона функција са #[tokio::main] атрибут. Он означава главну функцију као улазну тачку за Токио рунтиме. хелло_ворлд().аваит асинхроно извршава функцију хелло_ворлд.

Одлагање задатака са Токиом

Преовлађујући задатак у асинхроном програмирању је коришћење кашњења или задатака планирања за извођење у одређеном временском опсегу. Токио рунтиме обезбеђује механизам за коришћење асинхроних тајмера и кашњења кроз модул токио::тиме.

Ево како можете да одложите операцију са Токио рунтиме-ом:

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

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

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

Функција делаиед_оператион уводи кашњење од две секунде са методом спавања. Функција делаиед_оператион је асинхрона, тако да може да користи аваит да паузира своје извршавање док се кашњење не заврши.

Руковање грешкама у асинхроним програмима

Руковање грешкама у асинхроном Руст коду укључује коришћење типа резултата и руковање Руст грешкама помоћу ? оператер.

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

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

async fn process_file() -> io::Result<()> {
    let contents = read_file_contents().await?;
    
    Ok(())
}

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

Функција реад_филе_цонтентс враћа ио::Резултат који представља могућност И/О грешке. Коришћењем ? оператора након сваке асинхроне операције, Токио рунтиме ће ширити грешке у стеку позива.

Главна функција обрађује резултат помоћу наредбе подударања која штампа текст на основу исхода операције.

Реквест користи асинхроно програмирање за ХТТП операције

Многи популарни сандуци, укључујући Реквест, користе Токио за обезбеђивање асинхроних ХТТП операција.

Можете користити Токио са Реквест-ом да направите неколико ХТТП захтева без блокирања других задатака. Токио вам може помоћи да управљате хиљадама истовремених веза и ефикасно управљате ресурсима.