ユースケース編Goはじめにこれは以下の記事の続きの記事。以下の2つではgoroutineとchannelについて説明したので、これらを使って具体的な並行処理のユースケースを書いてみる。journalgoroutineによる並行処理がすべて終わるまで待つ処理を複数のgoroutineで並行で実行したい、というのはよくある例。起動したgoroutineがすべて終わるまで待ちたいときには、以下のようにsync.WaitGroupを使う。fibonacci(n-2)}goroutineで並行処理する数に上限を設けたいよくある要件として「同時に実行する数を制限したい」があるが、この場合はセマフォというパターンで実装する。具体的には、Goであればchannelにバッファが付けられるので、このバッファの数で同時実行数を制限できる。}}上記のプログラムはURLのリストからhttp.Getしてtitleだけを表示するプログラムである。ここではsemaphoreというバッファ付きのchannelを使って、以下のように同時実行数を制限できるようにしている。mainの中でsemaphoreを生成fetch関数にsemaphoreを渡すfetchの内部で、処理を実行する前にsemaphoreにデータを入れて、処理が終わったらdeferでsemaphoreからデータを取り出している。3と指定することで、同時にhttp.Getする数が3つに制限されてコンソールに出力される数が3行ずつになるはず。journal...バックグラウンドで一定の間隔で処理を行いたいこれはtime.Tickerとselectを使うことで簡単に実装できる。以下は1秒ごとにdoSomethingを呼び出すプログラム。v)}まとめユースケースについては探せばもっとありそうだけど、よくありそうな並行処理の実装パターン3つを紹介した。何かのためになれば幸いです。comment2019-10-122019年9月の振り返りReview8月の振り返りをサボってしまったのでまとめて。8.0へアップデートする記事を書いた。journal睡眠1日6時間以上寝る、ということを今年の目標にしている。5h59minという感じで9月はギリギリで未達成。これ平均で平日は大体5時間ぐらいなのでかなりやばめ。英語9月にIELTSのテストを受けてきた。詳細については以下にまとめたけど、感触としては悪くない気がする。ちなみに11月にTOEICも受ける予定。あと来年前半にTOEFLもおそらく受ける。あと一つ記事を書きたい。まとめまぁボチボチ頑張る。comment2019-09-30初めてIELTSを受験したEnglishIELTSってなに?国際的な英語の試験。大学の入学の条件に使われたり、国によっては永住権を申請する時のポイントとして使われるもの。自分は東京会場で、場所は幸ビルディングという新橋付近の貸し会議室っぽいところだった。鉛筆はお願いすれば試験の最中に試験官が削ってくれるので、鉛筆削りは持っていなくても大丈夫。会場に着いてから荷物を預けるIDチェック試験室に入室という流れ。会場のビルの会議室でビニール袋に荷物を詰めて預ける。8:40にはこの荷物置き場が物理的に閉鎖されるので、それまでに会場に着いて荷物を預ける必要がある。これをやったあとにトイレに行こうとすると再度指紋認証する必要がありめんどいので先にトイレは済ませておいたほうが良い。IDチェックでは指紋を採取されさらにカメラで写真を取られる。パスポートの顔写真と同一人物かも当然チェックされる。終わると、試験官と一緒に試験する別の部屋に行く。受験者は予想通り若い人が多かった印象。驚いたのは、20%ぐらいは外国人(見た目で明らかに日本人じゃないとわかる人)だったこと。アフリカ系の人やインド系の人が多かった。したら中国人や韓国人も結構いたのかもしれない。カップルで受験している人もちらほらいた。自分みたいな40代のおっさんは1%ぐらいしかいない雰囲気だった。意外なことにWritingReadingListneningという順番だった。Spreakingの順番で問題が構成されていたから、順番が全然違うことにびっくりした。もろもろのアナウンスが終わって9:20頃から試験がスタートした気がする。30分という時間配分で、12:30ごろには終わった。それぞれのパートの合間で問題や解答用紙を回収する時間があるので、少し休めるのは良かった。TOEICと比べるとこの休憩時間があるおかげでそこまで疲労感を感じなかった気がする。Speakingは午後にあり、自分は15:20開始だったので、昼ごはんを食べて新橋駅付近のカフェで時間を潰していた。保育園に子供を預けることと、預けないで家族が育てることについての意見を述べよというもので、どちらも自分にとっては馴染みのあるものだった。書く内容を日本語でまとめておいて、あとはそれをひたすら英語に訳すというスタイルで書いていった。word以上で、ギリギリかけた。word以上なので、圧倒的に時間が足りなくて文章の途中で終わってしまった。Writingは「字数が足りないからあとから文章を付け足す」ということがとてもやりにくいので、英文を書き始める前にちゃんと書く内容を決めておくことが大事だと思った。Basedなテストだったら文章の間に別の文を挿入したりするのが簡単にできたりするんだろうか、などと考えた。仕事ではこういう風に文章を書くことがあまりないので(デジタルなら後からいくらでも文章を付け足したり入れ替えたりできるので)、時間配分も含めて痛いミスをしてしまったように思う。wordぐらいしか書けていない。Reading最後のsection以外はそこまで難しくなかった。あと時間が圧倒的に足りないかなと思ったけど、ギリギリ終わるレベルだった。TOEICだと明らかに時間内に終わる量ではないので、それに比べれば時間的な厳しさはなかったように思う。ListeningSection1はたしかに一番簡単だった。選択式ではなく単語を埋めるタイプなので、冠詞をつけるかつけないかでけっこう悩んだ。Section4がやはり最高に難しくて、2,3問合っていればいいか、ぐらいのノリ。Speakingこれは外国人の試験官に連れられて小さい会議室で実施された。breakしてから本試験が始まる。仕事している?仕事で一番興味深いことはなに?どんな音楽を聴く?音楽を聴くときは一人で聴くのが好き?それとも他の人と聴くのが好き?というような質問をされた。Speakingが一番難易度が高いというか、普段の実力値が出てしまうのでこれが一番点数低そうだなと思った。まとめ試験の2週間前にIELTSの問題集をやって「うわっなにこれ難しすぎ」と絶望していたのだけど、本試験は意外と難しくなく、少しホッとした。スコアは10/13頃に送付されるらしいので、どのぐらいできているのか楽しみ。5.0〜6.0の間ぐらいだと思うんだけどどうなることやら。journalの続きの記事。goroutineに引き続き、Goの並行処理を支える重要な概念であるchannelについて説明する。channelとは?channelはメモリに対するアクセスを同期するためやgoroutine間の通信(データの受け渡し)として使うものである。Go言語による並行処理では水が流れる川のように、チャネルは情報の流れの水路として機能します。渡され、そこから下流に読み込まれます。}channelを使う上で覚えておくべき基本的なものとしては以下である。書き込みがない場合は、goroutineとして実行されている無名関数がずっとブロックされ何も起こらずにプログラムが終了する。ように、バッファをつけて生成することができる。この例だと3個のバッファがあるため、4個目を書き込む時にブロックされる。送信専用channelと受信専用channelがあるchannelをcloseするchannelのブロック通常であれば、goroutineはsync.WaitGroupを使って起動元のgoroutineにjoinするようにしないと、タイミングにもよるがほぼ確実に実行されずにmain関数が終了されてしまう。Worldと出力される。これはいったいなぜだろうか?理由は、channelからデータを受信する場合データが送信されるまでブロックするからである。上のプログラムの実行順序は以下のようになる。いうようなWorker処理を簡単に実装することができる。3)のようにmakeの第2引数にバッファを指定することができる。バッファを指定することで、channelの読み込みが一度も行われなくても、キャパシティが3のバッファ付きchannelであればgoroutineは3回まで書き込みが可能になる。バッファを指定しない場合は1回書き込むとブロックされる。送信・受信専用channelchannelを宣言する時に何も指定しなければ書き込みも読み込みも可能になるが、以下のように宣言することで書き込み専用・読み込み専用のchannelを作ることができる。書き込み専用この文法は、関数の引数にchannelを受け取る場合や戻り値としてchannelを返す場合に「これは書き込みしかできない」「これは読み込みしかできない」ということを明示できるため有用である。channelのclosechannelは使い終わったらcloseすることができる。closeされたchannelからはデータを読み込むことはできない。以下のプログラムはgoroutineでchに書き込み、最後にchannelをcloseしているmainの中のforループでチャネルchからデータを読み込んでいるというものであるが、closeされているのでその段階でchannelからの読み込みはブロックされずにforループが終了する。最後に実践的なchannelの使い方を載せておく。上で紹介した以下のchannelの特徴を使っている。バッファ送信・受信専用channelcloseこのプログラムが行っていることは、URLをchannelで送って、http.Getした結果をchannelで返すというものである。errを出力している。close(results)}まとめGoの並行処理の基礎となっているchannelについて説明した。次のパートでは、応用編としてgoroutineとchannelを使った並行処理の実践的なパターンを紹介したいと思う。