Single-threaded async Rust
この記事がちょっと面白かったので雑に要約
ネットワークから情報を取得し続けて、それをUIに反映するTUI appが書きたい
単純な制御なのでシングルスレッドによる非同期処理で十分だと感じた
tokioの flavor="current_thread" を使ってシングルスレッドにした UIスレッドとnetworkのスレッドは並列に動かしたい
まず、このように書いたがこれは間違いだった。networkが終わるまでuiがブロックされてしまう
code:_.rs
loop {
ui.draw();
network_request().await;
}
UIスレッドとnetworkスレッドを別々のタスクにして並列化した
code:_.rs
async fn main() {
tokio::join!(
async { // interface
let ui = UI::default();
loop {
ui.draw();
}
},
async { // network requests
loop {
network_request().await;
}
}
);
}
しかし、これもダメだった。
UIスレッド(// interface)内に他のタスクに処理を譲るyieldの処理がないため、networkのタスクに切り替わってくれなかった。
code:_.rs
async { // interface
loop {
ui.draw();
tokio::time::sleep(
std::time::Duration::new(0, 0)
).await; // I am ugly but I do work.
}
}