ここ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つはゴルーチンがある(メインゴルーチン)
- プロセスが開始する際に自動生成される
さんぷるコード
このコードを実行しても、コンソールに何も表示されなかった。
なぜかと言うと
- ゴルーチンがが生成される
- 生成されたゴルーチンがGoのランタイムにスケジュールされる
- sayHello()をホストしているゴルーチンが起動する前に、mainプログラムが終わってしまう可能性がある
- sayHello()が実行されるかどうかは不確実
かきなおす。
あぁぁ〜、いめーじ湧いた。輪読会で呼んでいるときはピントこなかったけど、かかないとわからんですね。async/await っぽい感じ(非同期処理と並行処理でぜんぜん比較する対象が違うけど、合流というところがなんか似てる気がする)。
クロージャーを使う。
- ゴルーチンが生成されたわけだけど、同じメモリ空間にあるsalutationを使っている。
昨日書いたTypeScript。
おんなじ書き方できんの?
書けるのか〜。すてき
今日はここまで。
明日も輪読会だけど、予習できなかったし、復習も半分もできなかった。うぅ。。無理せずがんばろ。
みっちーさんがgithubに残してくれたメモもめちゃ助かる。進行しながらよく書けるな・・すごい。
tenntennさんコーヒーにも手を付けはじめたけど、まだ、すけるとん1しかやっていない。連休中にすすめるぞ