База Hintsage

Конкурентность и async

Send/Sync, threads, channels, futures и async runtime.

Практика

Вопросы: Конкурентность и async

В однопоточном runtime две задачи используют yield_now().await. Разберите, гарантирует ли этот вызов строгую очерёдность их выполнения.

use tokio::task::yield_now;

#[tokio::main(flavor = "current_thread")]
async fn main() {
    tokio::join!(worker("A"), worker("B"));
}

async fn worker(name: &'static str) {
    for i in 0..3 {
        println!("{name}: {i}");
        yield_now().await;
    }
}
Программирование RustКонкурентность и asyncРазработчик Rust, специализирующийся на асинхронных сервисах

В async-коде нужно определить, является ли значение из thread_local! локальным для задачи. Какой результат допустим после передачи задачи между рабочими потоками?

use std::cell::Cell;
use tokio::task::yield_now;

thread_local! {
    static POLLS: Cell<u32> = Cell::new(0);
}

#[tokio::main(flavor = "multi_thread", worker_threads = 2)]
async fn main() {
    let task = tokio::spawn(async {
        POLLS.with(|p| p.set(p.get() + 1));
        yield_now().await;
        POLLS.with(|p| p.get())
    });
    println!("{}", task.await.unwrap());
}
Программирование RustКонкурентность и asyncРазработчик Rust с опытом создания async-сервисов

Показано 120 из 50