GoLang

Go言語による並行処理輪読会 - Book reading party

ここ1年半くらいお世話になっているGo言語のコミュニティで、最近はじまった「Go言語による並行処理」の輪読会に参加させてもらっています。

輪読会のDiscordチャンネル名が book-reading-party なのですが、ネーミングがかわいくないですか?発想がすてきすぎる。

自分は参加していないのですが、k8sのコードリーディング会のなまえも、code-reading-party で、チャンネルをのぞきみすると、わいわいパーティのように会話が弾んでいて、大変楽しそうであります。自分、k8sはチュートリアルとGPUG女子会ハンズオンでやったくらいで、興味はあるのですが、最近いろいろ手を広げすぎているので参加をがまんしています。はい。

今回は第3章からでした。1章も2章もむずかしくて、ひとりで読むとトンチンカンです😅。1章で挫折しそうなところをみんなで考えながら読んでると、わからないながらにも気づきがあったりと勉強になります。

この記事に書くこと。

  • 今回やったキーワードについておさらいがてら書く。
  • 本には「事前に知っていなければならない用語」が数多くでてくるので、自分の知らない「謎な用語」について書く。
  • 曖昧に覚えているものについて、調べて書く。

第3章 Goにおける並行処理の構成要素

OSスレッド

  • OSにスケジュールされる

グリーンスレッド

  • 言語処理系の仮想マシン(JVMなど)やランタイムライブラリによってスケジュールされる
  • OSの機能によらずマルチスレッド環境をエミュレートする

プリエンプティブマルチタスク(非協調的マルチタスク)

  • OSがCPUをマルチタスクで管理する方式
  • プログラム側の振る舞いによらず、OS側から差止めや再開などをする仕組み

コルーチン(co-routine)

  • プログラミング構造の一種
  • いったん処理を中断したあと、続きから処理を再開できたりする
  • 複数のコルーチンを強調動作させることができる
  • 対して、サブルーチンというのがある(エントリーからリターンまでをひとつの処理単位とする)

Goroutine ゴルーチン

  • Goのランタイムに管理される軽量なスレッド
  • 他のコードに対し並行実行している関数
  • 無名関数でも動作する
  • OSスレッドでなない
  • 必ずしもグリーンスレッドでない
  • コルーチンを抽象化したもの
  • プリエンプティブでない並行処理のサブルーチン(関数、クロージャー、メソッドに相応)割り込みされない
  • Goのランタイムと密結合している

メインゴルーチン

  • すべてGoプログラム1つはゴルーチンがある(メインゴルーチン)
  • プロセスが開始する際に自動生成される

さんぷるコード

このコードを実行しても、コンソールに何も表示されなかった。

なぜかと言うと

  1. ゴルーチンがが生成される
  2. 生成されたゴルーチンがGoのランタイムにスケジュールされる
  3. sayHello()をホストしているゴルーチンが起動する前に、mainプログラムが終わってしまう可能性がある
  4. sayHello()が実行されるかどうかは不確実

かきなおす。

あぁぁ〜、いめーじ湧いた。輪読会で呼んでいるときはピントこなかったけど、かかないとわからんですね。async/await っぽい感じ(非同期処理と並行処理でぜんぜん比較する対象が違うけど、合流というところがなんか似てる気がする)。

クロージャーを使う。

  • ゴルーチンが生成されたわけだけど、同じメモリ空間にあるsalutationを使っている。

💡昨日書いたTypeScript。

おんなじ書き方できんの?

書けるのか〜。すてき✨

今日はここまで。

明日も輪読会だけど、予習できなかったし、復習も半分もできなかった。うぅ。。無理せずがんばろ。

みっちーさんがgithubに残してくれたメモもめちゃ助かる。進行しながらよく書けるな・・すごい。

tenntennさんコーヒーにも手を付けはじめたけど、まだ、すけるとん1しかやっていない。連休中にすすめるぞ🐹

-GoLang