- この記事は、大規模な高並行性を持つユーザー空間ソフトウェアにRustを使う際の課題について論じている。
- Rustの非同期モデルは、現代のコンピューティングにおける2つの中核概念である並行性と並列性を扱うように設計されている。
- 並列性は、複数のCPUでコードを同時に実行することを含む。
- 並行性は、問題を分離し、独立した部分に分け、順序に依存せず、あるいは部分的な順序で実行することを含む。
- この記事は、高コストなプロセス間通信のために、並行性のために複数プロセスを使うことの限界を強調している。
- 同じメモリを共有するプロセスであるスレッドが代替案として提示されるが、競合状態やデッドロックのような複雑な問題を引き起こす可能性がある。
- Tony Hoareの1978年の論文 "Communicating Sequential Processes" は、スレッド同士がメッセージを送るためにキューまたはチャネルを使うことを提案しており、プロセスのような分離性や容易なデバッグなど、いくつかの利点を提供する。
- Rustの標準ライブラリには、
std::sync::mpsc::sync_channel にチャネルが含まれている。
- しかし、数万人のユーザーに接続されたWebサーバーのように、高水準の並行性を必要とする問題では、スレッドだけでは不十分な場合がある。
- Rustはこうした状況に対して、関数が非同期としてマークされるとfutureまたはpromiseを返し、結果を生成するまで待機できる "async/await" モデルを使用する。
- その利点にもかかわらず、非同期Rustには、すべてが問題なく動作することをコンパイラに納得させる必要があるといった課題がある。これは生のスレッドより難しいことがある。
- 解決策として "アトミック参照カウント"、すなわちArcの利用が提案されるが、ガベージコレクタの問題に似た課題を引き起こす可能性があり、万能薬ではない。
- この記事は、Rustは他の分野での強みにもかかわらず、大規模な高並行性を持つユーザー空間ソフトウェアにとって最適なツールではないかもしれないと示唆して締めくくられている。
1件のコメント
Hacker Newsの意見
tokiocrateに依存することを強いられると主張しています。Arcは「わからないもの」ではなく、どこでどのように所有しているかによって決まるものであり、著者は以前のメンタルモデルをRustに押し付けようとしているのだと主張しています。async-scopedのようなunsafeなcrateを使って、C++で書かれていたなら入り込んでいたであろうバグの大半を捕捉するのは、妥当な妥協だと提案しています。