Rust: How to implement an event loop
概要
- 概要
- イベントループの実装
イベントループの実装
まず、非同期ソケットや poll を使用しないでイベントループを行っているスレッドとの通信を実装してみよう。どのような言語でも Worker スレッドを用いたこのような非同期処理の設計はしばしば目にする。
イベントループを行っているスレッド内で処理を行い、その結果を Future
として返す実装は Rust で以下のように書くことができる。
すでに存在する特定のスレッドに処理を委譲しなければならないため async
関数を使うことができない点に注意。Rust のスレッド間通信は原則として channel
を使用するのが望ましい。channel は片側のスレッドで send したデータをもう片方のスレッドから receive することができる (目的は Go の chan
や Java の BlockingQueue
と似ている)。
非同期で実行する処理 dyn FnMut()
はコンパイル時にサイズが決定できないため Box
化する。また、受け渡しを行うために Send
が必要である。
TaskState
がスレッド間で共有される。
Sender<Task> |
イベントループに Task を送信する。 |
Receiver<Task> |
イベントループが Task を受け取る。 |
TaskState |
スレッド間で共有される状態。 |