nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | GO TechTalk #21、Go/Rust/Kotlin/Python/JSの並列処理・並行処理が一覧できて、すっごく面白かった! #goinc_tech_talk

はじめに

せつ菜ちゃん & あげはさん、お誕生日おめでとうございます8️⃣8️⃣ nikkieです。

そんなよき日に非常に知的好奇心を刺激される"神"勉強会に参加してきました。
「並列処理をGo/Rust/Kotlin/Python/JSで解説!思想の違いを体感しよう」

目次

勉強会の概要

どうする? GOする!のGO株式会社主催の勉強会。
各言語の並行処理・並列処理を一覧しちゃおうという企画、すごく面白いと思うんです!

ライブのURLは以下(見返したく、アーカイブ残ったら嬉しいな〜)

ベースとなる技術書典本

今回の勉強会のもととなった技術同人誌がこちら

気になる「並列処理・非同期処理」「グラフアルゴリズム」「ロガーの組み方」「型の取り扱い」を、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ルーチン。
Go言語ってgoっていっぱい書けばいい感じになるってこと!?
ストリーミング処理をGoルーチンで処理する例が紹介されました。

別勉強会ですが、『Go言語プログラミングエッセンス』のmattnさんの発表でも「非同期にしたい関数に go を付けるだけで簡単に非同期を呼び出せる」とありました。

Go、なんか楽しそうだぞ🤩

ちょっとしたデータ分析の並列化・Python

PythonからはCPUバウンドな処理をマルチプロセスで並列化する例
機械学習の特徴量生成処理(時系列データ)

concurrent.futures.ProcessPoolExecutor

Python実践入門』の解説で私は完全に理解したProcessPoolExecutor
発表ではpickle化できるオブジェクトをsubmitしないといけないという落とし穴に触れられ、回避策も共有されました(例:submitしたあとにpickle化できないオブジェクトを作る)

資料を見つつ動画を見返したいですね(一回だと全ては分からなかった勢)。

Rustにおける並行処理

並行処理におけるデータ共有について。
std::sync::mpsc::channel(チャネル)を使うとのこと。
mpscはmulti-producer single-consumerの略ですが、receiver(=consumer)が1つだけ(single)でない場合の実装へと話が進みます

std::sync::Arcstd::sync::Mutex、初めて見ました...(こんなものがあるのですね)

JavaScript の ⾮同期処理 Promise、 async/await を理解する

PCのウェブブラウザのJavaScriptの話。

同期と非同期で命令の実行の仕方が違う

  • 同期処理はCall stackに積まれて実行されていたのか!
  • 非同期処理(例:setTimeout)はqueueに入る
    • イベントループがqueueを監視していて、call stackに積む

これは、シングルスレッドによる擬似的な非同期処理。

  • Ajax登場後、標準化されていない非同期処理ライブラリの時代
  • Promiseオブジェクトの登場(ES6以降、JSの標準仕様)
  • async/awaitはPromiseのシンタックスシュガー

async/awaitで非同期処理を同期処理みたいに書けるという点、Pythonにもasync/awaitがあり、それを使った経験からも非常に共感です。

Kotlin の 並⾏処理へのアプローチ

Kotlinでは、Coroutine!
launch {}ブロックで書くそうです。

suspendというキーワードもあり、これを付与した関数(suspend fun b() {})は呼び出したタイミングで他のCoroutineに切り替えられるとのこと。

実はCoroutineにはCoroutineScopeなるものが関わっていて、Coroutineを構造化することで、例外が発生したらすべてのCoroutineをキャンセルといったこともできるそうです。
Structured concurrency!

実況より:Ruby

✍️プロセス、スレッド、Fiber Scheduler、Ractor

終わりに

いやー、5(+1)つの言語で並列処理・並行処理を見比べられて非常に刺激的でした。
Pythonで並行処理の理解に結構苦労したので、他の言語で簡単に書けると聞くと、すっごく興味を惹かれます(隣の芝生は青いってやつかもですが)。
goっていっぱい書きたく、Go言語を書いてみたいな〜1(すっごく楽しそうじゃないですか?)。

質問もたくさん出て盛り上がりました。
時間内に取り上げられなかったものは、Twitterアカウントで回答されています(なんてありがたい!)

発表者の皆さま、運営の皆さま、そして参加者の皆さま、どうもありがとうございました!

昨年のみんなのPython勉強会を思い出しながら)夏は非同期処理の季節なのかもしれませんね2


  1. 7月のみんなのPython勉強会で中川さんがGoも使っているという話を聞いていたのも興味を持ったきっかけです