超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)
私ももう一ヶ月も経つと超初心者から次第に初心者になりさらに一年も経つと経験者となって今の苦労はきれいに忘れてしまいそうです。そこで今のうちにつまずいたあれこれを記事にしてこれからGo言語を始める方の参考にしていただこうと思い立ちました。
最初はもっともGo言語らしいと思われるGoroutine(並列処理)の話です。以下もっとも簡単なGoroutineの例ですが、これでも非同期で並列に処理が進んでいることがわかります。次にどうやって動作を同期させるのかというようなことでチャンネルの話なんかが出てきます。
=====================================================
こんなプログラムを書きます。
package main
import "time"
import "fmt"
func sub(n int) {
for i := n+1; i < n+5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
func main() {
sub(10)
for i := 1; i < 5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
結果はいうまでもなく
11 12 13 14 1 2 3 4
となります。このプログラムをほんのすこしだけ変えてみます。
package main
import "time"
import "fmt"
func sub(n int) {
for i := n; i < n+5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
func main() {
go sub(10)
for i := 1; i < 5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
実行すると次のような結果が得られます。
1 11 2 12 3 13 4 14
sub()とmain()が並行して動いていることがわかります。sub()とmain()は非同期で動作しますので結果は一意ではないことに注意します。14が表示されないなんてこともあります。
さらに次のように変更してみます。
package main
import "time"
import "fmt"
func sub(n int) {
for i := n; i < n+5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
func main() {
go sub(10)
go sub(20)
for i := 1; i < 5; i++ {
fmt.Println(" ",i)
time.Sleep(time.Second)
}
}
今度はこんな結果が得られます。
1 21 11 22 2 12 3 23 13 4 24 14
main()と二個のsub()が並行して動いています。
-------------------------
参考
「超初心者のGo言語/agouti - ブラウザ操作の基本の基本」
「超初心者のGo言語 - 複数の戻り値をもつ関数」
「超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)」
「Showroom - 自動星集め・星投げ・カウントツール)」 (使用法とソースつき)
「Showroom - 福引するプログラムとその結果 (1)」
「Showroomの複数アカウント(複アカ、複垢)について考えてみた(1)」
「Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間
「Showroom ラスカルイベの最後の5分間」
「Showroomでの自動星集めの試み (1)」
「Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る」
「Showroomでの自動星集めの試み (4) 星集めツール」
「Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/Agouti)」
---------------------
「GoDoc - package agouti」
「Qiita @0829 - Goではじめてみたブラウザの自動操作」
「Qiita @tenten0213 - agoutiというWebDriverクライアントを使って面倒な作業を自動化する」
「Qiita @masaru_b_cl - Windows上でGo言語初心者向け学習環境を作る」
「はじめてのGo言語」
「天才まくまくノート - まくまく Hugo/Go ノート - 関数を定義する (func)」
「Qiita @TakaakiFuruse - Golang Goの並列処理を学ぶ(goroutine, channel)」
「Qiita @To_BB - Rubyエンジニアがゴルーチン(Go言語)を学んでみた【初心者向け】」
「Qiita @fukumone - goroutine 使い方まとめ」
« Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/agouti) | トップページ | 超初心者のGo言語 - 複数の戻り値をもつ関数 »
「Go言語/agouti」カテゴリの記事
- 超初心者のGo言語/agouti - ブラウザ操作の基本の基本(2018.01.20)
- 超初心者のGo言語 - 複数の戻り値をもつ関数(2018.01.13)
- 超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)(2018.01.09)
この記事へのコメントは終了しました。
« Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/agouti) | トップページ | 超初心者のGo言語 - 複数の戻り値をもつ関数 »
コメント