2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
Rust編「Rustにおける並列処理」(全1記事)
リンクをコピー
記事をブックマーク
鈴木文太氏(以下、鈴木):よろしくお願いします。「Rustにおける並行処理」について発表していきたいと思います。私はGO株式会社の鈴木文太と申します。2021年6月に入社して、今はタクシー事業者向けの管理画面の開発などをやっています。
今回話すことについてですが、まずプロセスと並行・並列処理の基本について少しお話ししたあとに、スレッド間でデータ共有がない場合のRustのコードと、スレッド間でデータ共有がある場合のRustのコードを示して、Rustで並行処理を扱う際のメリットやデメリットについて話したあとに、まとめみたいな感じでやっていこうかなと思っています。
鈴木:(プロセスと並行・並列処理の基本については)森下さん(森下篤氏)が最初のほうにわかりやすく書いてくれたので、このあたりはスキップして……。
よく「難しい」と言われる並行処理について、何が難しいのかということですが、代表的な問題としては、具体的にプロセス間でのデータ共有が難しくて、デッドロックがやはり有名な問題かなと思います。
デッドロックというのは、プロセスとかスレッドがお互いのリソースの解放を待ち続けて処理がロックしてしまい、それぞれの処理が進行しなくなる状態で、RDB(Relational Database)とかでも見聞きすることが多いかもしれません。
鈴木:(スライドを示して)データ共有がないパターンのRustのコードですが、thread::spawnで新しくスレッドを立てて2秒待つというコードと、もう1個立てて1秒待つというコードを実行した結果が下に書いてあります。こちらの"Hello from thread 2"が先にコンソールに出力されます。これに関しては特に説明する必要もなくて、生のスレッドをそのまま使っている感じです。
データ共有があるパターンの並行処理ですが、いろいろやり方はあると思いますけれども、今回はRustが標準ライブラリで提供しているチャネルを使ってのスレッド間通信について話をしようと思います。
Rustのチャネルについてですが、簡単に言えば「スレッド安全なキューのようなもの」と思ってもらっていいかなと思います。スレッド安全というのは、データ競合などの未定義動作を起こさないという意味ですね。
チャネルの使い方のコードです。mpscというところからチャネルを作って、新しくスレッドをスポーンして、その中でsendメソッドでチャネルに"World!"という文字列を入れて、元のメインスレッドでrecvメソッドでデータを受け取ってプリントすると、"Hello, World!"と出るよという話です。
先ほどのスライドに貼っていたのですが、mpscクレートについてです。Rustでは、stdライブラリからmpscをインポートすることによって、チャネルを使うことができるということです。
mpscはmulti-producer、single-consumerの略で、以下の特徴があります。multi-producerは、チャネルにsendするsenderを複数個作成することが可能です。それに対してconsumerのデータを受け取るreceiverは1個しか作成できない性質があります。
これだとreceiverが1つしか作れないため、困ることがあることもあるという感じです。
具体的な例で、Webアプリなどでログへの書き込みがどんどんチャネルに溜まっていき、receiverの処理が間に合わない時があるとして、そういう場合にmulti-producerなら一応複数作るということもできるということで、スレッド安全にして複数のスレッドからデータを読むようにする場合のサンプルコードを紹介します。
そのためにはMutexとArcというものを使うので、その説明をしようと思います。
Mutexについてです。複数のスレッドstd::syncからインポートできて、複数のスレッドからアクセスされると困るデータを保護するために、ロックの仕組みを提供する機能があります。
ArcはAtomic Reference Countの略で、複数のスレッド間でデータを共有するための所有権を管理するための仕組みを提供できます。MutexとArcは一緒に使うことが多い気がします。
サンプルコードです。(スライドを示して)stdとmpscがチャネルを作るところまでは一緒です。Arc::new(Mutex::new(receiver))というところで、右側に簡単な図を書いたのですが、mpscからインポートできるreceiverは、ロックやアトミック参照カウントが基本的には使えないので、mutex::newでラップすることにより排他ロック機能を使えるようにして、Arc::newでmutexをラップすることにより、アトミック参照カウントを使えるようにします。
1個目のfor文の中ですが、Arc::cloneでクローンすることにより、参照カウントを増やします。これによってどのスレッドに所有権があるかが、コンパイラ側にわかりやすくなります。
スレッドをspawnしてrx.lock。これはMutexの機能で、recvでロックを取ってからデータを受け取ることができます。下のほうはsenderです。これは複数送れるので、特に説明はいいかなと思います。
鈴木:Rustで並行処理を扱う際のメリットやデメリットについてです。メリットは先ほどのMutexとかArcの話が少し複雑だったと思いますが、あれがあるおかげで、コンパイルが通った時点で、スレッドの安全性とスレッド整数性がかなり担保されているので安心感があり、それでいて速度も最高レベルになります。Rustによく言われることなのですが、ゼロコスト抽象化というところですね。
デメリットといえば、ArcやMutexなど、ロックや参照カウント周りの幅広い知識がけっこう必要かなと思いました。
鈴木:所感です。スライドを作っていて思ったのですが、データ競合などの難しい問題をコンパイラレベルで弾けるのが、やはりかなり便利かなと思いました。他の言語でデータ競合のバグが発生してしまった場合、再現とか修正がかなり大変になりがちです。
でもRustの場合は、発生可能性がある場合、だいたいコンパイルエラーになるので安心感があるかなと思いますね。
あと、入門してから時間が経って、あらためて調べて思ったのですが、最近は日本語のわかりやすい資料が増えてきていて、Rustの学習コストは以前と比べたら下がってきているのかなと思いました。
今回の発表のまとめです。データを共有する時と共有しない時のRustの並行処理の書き方を軽く説明したのと、標準のライブラリを普通に使うだけでは実現できないので、応用的なチャネルを使う方法を1個説明しました。
あとはRustで並行処理を扱う際のメリットやデメリット、それから所感というか感想を発表しました。まだ時間はあるのですが、Rustの発表は以上になります。
司会者:鈴木さん、ありがとうございました。質問がいくつか来ていますね。読み上げますね。「いいね」が2個ついている「単語としてはGo編と共通のチャネルが出てきましたが、RustのチャネルとGoのチャネルは概念としてはどの程度が共通なのでしょうか?」という質問はいかがでしょう?
鈴木:概念としては同じものですが、文法上の表現方法などはGoとRustではいろいろと違うと思いますね。
司会者:はい。あといろいろと来ていますが、もう1個ぐらいチョイスしてもらえると。
鈴木:「複数プロセス複数スレッドの場合でも同じように上手いことやってくれますか?」という質問です。そうですね。(どの程度OS側の機能を使ってデータを共有するかにもよると思いますが)複数プロセス複数スレッドの場合でも同じようにやってくれると思います。コンパイルが通るのであれば、データ競合は起きないと思います。
司会者:ありがとうございます。以上で鈴木さんのパートを終了したいと思います。鈴木さん、ありがとうございました。
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05