はじめに
せつ菜ちゃん & あげはさん、お誕生日おめでとうございます8️⃣8️⃣ nikkieです。
そんなよき日に非常に知的好奇心を刺激される"神"勉強会に参加してきました。
「並列処理をGo/Rust/Kotlin/Python/JSで解説!思想の違いを体感しよう」
目次
- はじめに
- 目次
- 勉強会の概要
- 感想:一覧できてすっごく面白かった!
- Goルーチンで並列処理を実装しよう
- ちょっとしたデータ分析の並列化・Python
- Rustにおける並行処理
- JavaScript の ⾮同期処理 Promise、 async/await を理解する
- Kotlin の 並⾏処理へのアプローチ
- 実況より:Ruby
- 終わりに
勉強会の概要
どうする? GOする!のGO株式会社主催の勉強会。
各言語の並行処理・並列処理を一覧しちゃおうという企画、すごく面白いと思うんです!
ライブのURLは以下(見返したく、アーカイブ残ったら嬉しいな〜)
GO TechTalk #21 「並列処理をGo/Rust/Kotlin/Python/JSで解説!思想の違いを体感しよう」
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
はじまります!
ライブ配信:https://t.co/221cAgF0E5
イベント概要:https://t.co/NZuK99FlIf#goinc_tech_talk
ベースとなる技術書典本
今回の勉強会のもととなった技術同人誌がこちら
気になる「並列処理・非同期処理」「グラフアルゴリズム」「ロガーの組み方」「型の取り扱い」を、Python/Rust/Kotlin/Goで比べてみよう!
こちらはなんと無料!
こんな面白そうな本を頒布されたら、積ん読が増えてしまう〜(嬉しい悲鳴)
GO Inc. テックブック部さんは他の書籍も無料🌟で頒布されていました!
アーカイブ & 資料(みんなぜひ見て!)
(2023/08/10 追加)
(2023/08/10 追加終わり)
感想:一覧できてすっごく面白かった!
私的には"神"企画!
めちゃめちゃ刺激を受けました。
私のレベル感としては以下です
- 仕事で使っている
- 趣味利用
- 完全に理解の前
- Kotlin
- Rust
- Go
書いたことのない言語もあり(Go)、すべての話を理解できたわけではないですが、一覧できたのはすごく面白かったです。
例えばGoとRustには「チャネル」という概念があり、概念としては同じだけど性質は言語ごとに異なるという点(Rustの質疑より)。
ここは似ているとかここは言語独自だとか発見がありました。
5つ並べてわかった、Pythonのマルチプロセスの特異性よ...(pickle/unpickleの制約)
Goルーチンで並列処理を実装しよう
Go言語での並列・並行処理はGoルーチンとチャネルを使う#goinc_tech_talk pic.twitter.com/3aKExP5DWA
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
go 関数()
と書くだけでGoルーチン。
Go言語ってgo
っていっぱい書けばいい感じになるってこと!?
ストリーミング処理をGoルーチンで処理する例が紹介されました。
別勉強会ですが、『Go言語プログラミングエッセンス』のmattnさんの発表でも「非同期にしたい関数に go を付けるだけで簡単に非同期を呼び出せる」とありました。
Go、なんか楽しそうだぞ🤩
ちょっとしたデータ分析の並列化・Python
PythonからはCPUバウンドな処理をマルチプロセスで並列化する例
機械学習の特徴量生成処理(時系列データ)
Pythonは並列処理が苦手#goinc_tech_talk pic.twitter.com/rfOUWdz9Lo
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
concurrent.futures.ProcessPoolExecutor
『Python実践入門』の解説で私は完全に理解したProcessPoolExecutor
。
発表ではpickle化できるオブジェクトをsubmitしないといけないという落とし穴に触れられ、回避策も共有されました(例:submitしたあとにpickle化できないオブジェクトを作る)
資料を見つつ動画を見返したいですね(一回だと全ては分からなかった勢)。
Rustにおける並行処理
並行処理におけるデータ共有について。
std::sync::mpsc::channel(チャネル)を使うとのこと。
mpscはmulti-producer single-consumerの略ですが、receiver(=consumer)が1つだけ(single)でない場合の実装へと話が進みます
Rustで並行処理を扱う際のメリデメ#goinc_tech_talk pic.twitter.com/iSdyXud0CU
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
std::sync::Arc、std::sync::Mutex、初めて見ました...(こんなものがあるのですね)
JavaScript の ⾮同期処理 Promise、 async/await を理解する
PCのウェブブラウザのJavaScriptの話。
ブラウザーのJSでどうやって擬似的に非同期を実現しているか#goinc_tech_talk pic.twitter.com/1MOhMzV69o
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
同期と非同期で命令の実行の仕方が違う!
- 同期処理はCall stackに積まれて実行されていたのか!
- 非同期処理(例:setTimeout)はqueueに入る
- イベントループがqueueを監視していて、call stackに積む
これは、シングルスレッドによる擬似的な非同期処理。
async/awaitで非同期処理を同期処理みたいに書けるという点、Pythonにもasync/awaitがあり、それを使った経験からも非常に共感です。
Kotlin の 並⾏処理へのアプローチ
Kotlinでは、Coroutine!
launch {}
ブロックで書くそうです。
KotolinではCoroutineで並行処理を実現する#goinc_tech_talk pic.twitter.com/Eyi7ApQN7s
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
suspend
というキーワードもあり、これを付与した関数(suspend fun b() {}
)は呼び出したタイミングで他のCoroutineに切り替えられるとのこと。
実はCoroutineにはCoroutineScopeなるものが関わっていて、Coroutineを構造化することで、例外が発生したらすべてのCoroutineをキャンセルといったこともできるそうです。
Structured concurrency!
KotolinのCoroutineは親子関係を持て、一斉にキャンセルできる#goinc_tech_talk pic.twitter.com/OsbTxgT0fH
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
実況より:Ruby
Rubyはプロセス、スレッド、Fiber Scheduler、Ractorといて選択肢多いんだよなhttps://t.co/SVtQmIAxG9#goinc_tech_talk
— H. NOMATA (@hiromichinomata) 2023年8月8日
✍️プロセス、スレッド、Fiber Scheduler、Ractor
終わりに
いやー、5(+1)つの言語で並列処理・並行処理を見比べられて非常に刺激的でした。
Pythonで並行処理の理解に結構苦労したので、他の言語で簡単に書けると聞くと、すっごく興味を惹かれます(隣の芝生は青いってやつかもですが)。
go
っていっぱい書きたく、Go言語を書いてみたいな〜1(すっごく楽しそうじゃないですか?)。
質問もたくさん出て盛り上がりました。
時間内に取り上げられなかったものは、Twitterアカウントで回答されています(なんてありがたい!)
本日開催しましたGO TechTalk #21 の配信中にお答えできなかった質問への回答ですが、いくつかピックアップした上で順次こちらのスレッドに投稿してまいります。 #goinc_tech_talk
— GO Inc. dev | タクシーアプリ『GO』 (@goinc_techtalk) 2023年8月8日
発表者の皆さま、運営の皆さま、そして参加者の皆さま、どうもありがとうございました!
(昨年のみんなのPython勉強会を思い出しながら)夏は非同期処理の季節なのかもしれませんね2