SlideShare a Scribd company logo
1 of 27
Go言語ハンズオン
マルチスレッドで遊ぼう


         GDG神戸 2012/8/25
     ちいといつ(twitter:titoi2)
Go言語の特徴
 Go言語と言えば,ゴルーチン(Goroutine)を使っ
てマルチスレッドのプログラムが簡単に作れるの
が特徴の一つ。
 今日はハンズオン形式でGo言語のゴルーチンで
遊びます。
 キーワードはゴルーチンとチャネルです。
このオポチュニティにぜひ体験して下さい。
実行環境
 Go言語の開発環境を構築している方は,そのま
までプログラムを実行して下さい。


 開発環境のない方は,こちらのアドレスにアク
セス。
http://play.golang.org/

※実行はシングルスレッドになりますが,ゴルーチ
ンは体験出来ます。
ハンズオンの進め方
簡単なGo言語のプログラムを示しますので,各自
入力して実行してください。


ソースの意味や文法は随時説明しますが,分から
ないところは都度質問して下さい。
まずは普通のプログラム
package main
import "fmt"

func say( s string) {/ say 関数定義
                      /
! fmt.Println(s)
}
func main() { / メイン処理
               /
! say("Hello golang")
}
実行してみます
Hello golang

と表示されました?
マルチスレッド化
func main() {
! go say("Hello golang")
}

メイン処理を修正します。
関数呼び出しの前に go と付けるだけ。
簡単スレッド化が出来ました。
これをゴルーチンと言います。
実行してみましょう
なんにも出ません orz


mainが先に終了してしまうのでsayが出力する前に
プログラムが終了しています。
修正します
package main
import "fmt"
import "runtime"
func say(s string) {
! fmt.Println(s)
}
func main() {
! go say("Hello golang")
! runtime.Gosched() / 他のゴルーチンを実行
                     /
}
実行してみます
Hello golang

と表示されました?


runtime.Gosched()で無理やりゴルーチンの制御を
切り替えてsayが実行されるようにしました。
※mainもゴルーチンの一つです。(多分)
終了を待つには
 無理やりsayに制御を移して実行させましたが,
mainでsayの終了を待つことが出来れば問題はあり
ません。
ゴルーチンの終了待ちをするには?
 チャネルを使います。
早速,プログラムを修正します。
チャネルで同期
func say(s string, ch chan int) {
! fmt.Println(s)
! ch <- 1 / 値を送信
           /
}
func main() {
! var ch chan int / チャネル変数宣言
                   /
! ch = make(chan int) / チャネル初期化
                       /
! go say("Hello golang", ch)
! <-ch / 受信待ち
        /
}
実行してみます
Hello golang

と表示されました?


 チャネルによる通信を使って,mainとsayの同期
を取ることにより,sayの終了待ちが出来ました。
チャネルとは
・ゴルーチン(スレッド)間で通信を行うための
特殊な変数。
・任意の型のデータを送受信が可能。
・同期と非同期(容量付き)がある。


・同期チャネルを使うことによりスレッド間の同
期が可能
チャネル変数の宣言
チャネル変数の宣言方法
var 変数名 chan 型名


例えばint型のチャネル
var ch chan int

文字列型のチャネル
var ch chan string

型は何でもOK
チャネル変数の初期化
チャネル変数を初期化するには,必ずmake関数を
使います。例えばint型チャネル
var ch chan int
を初期化するには
ch = make(chan int)

オプションで容量を指定すると非同期チャネルに
ch = make(chan int, 100) / 非同期チャネル
                          /
送信と受信
チャネルにデータを送受信するには <- を使いま
す。
ch <- 1 / チャネルに1を送信
         /
a = <- ch / チャネルから受信してaに代入
           /
<-ch / 受信だけ行い値を捨てる
      /


最後の値を捨てるケースは同期だけ行いたいと
き。
同期チャネル
容量の無いチャネルを別名,同期チャネルと呼び
ます。
あるスレッドからチャネルに送信した場合,別の
スレッドがチャネルから受信するまで処理を停止
します。


逆に,チャネルから受信しようとしたときは,送
信が行われるまで処理を停止します。
同期メカニズム
mainスレッド                         sayスレッド
  go say("Hello golang", ch)

  <-ch
  ちょい待って チャネル                              Println()

                     ch          ch <- 1

     ほい 1                      送ったで

終了                                     終了
チャネルで同期
func say(s string, ch chan int) {
! fmt.Println(s)
! ch <- 1 / 値を送信
           /
}
func main() {
! var ch chan int / チャネル変数宣言
                   /
! ch = make(chan int) / チャネル初期化
                       /
! go say("Hello golang", ch)
! <-ch / ch から受信
        /
}
チャネル通信
同期チャネルでスレッド間の同期が取れることが
わかりました。
次に,チャネルによるスレッド間通信を行いま
す。
FIZZ BUZZ
ゴルーチンを使ってFIZZ BUZZ問題を解いてみま
しょう。
FIZZBUZZとは
・1から順番に数値を出力
・ただし,3の倍数なら”FIZZ”と出力
・ただし,5の倍数なら”BUZZ”と出力
・ただし,3と5の倍数なら”FIZZBUFF”出力。
FIZZ BUZZ
こんなゴルーチンを作ります。
func fizzbuzz(in chan int, out chan string)

チャネルinから数値を受け取り,3の倍数な
ら ”FIZZ”,5の倍数なら”BUZZ”,ただし3と5
の倍数なら”FIZZBUFF”とoutに出力する。
その他の数値の場合は文字列化してoutに出力す
る。
package main
import "fmt"
import "strconv"
func fizzbuzz(in chan int, out chan string) {
! for { / 無限ループ
         /
! ! var n int = <-in / in から受信してnに代入
                      /
!   !   switch {
!   !   case n%15 == 0:! out <- "FIZZBUZZ"
!   !   case n%3 == 0:! out <- "FIZZ"
                        !
!   !   case n%5 == 0:! out <- "BUZZ"
                        !
!   !   default:! ! ! out <- strconv.Itoa(n)
!   !   }
!   }
}
func main() {
! ch := make(chan int)
! out := make(chan string)
! go fizzbuzz(ch, out)
! for i := 1; i < 100; i++ {
! ! ch <- i
! ! s := <-out
! ! fmt.Println(s)
! }
}
その他の機能など
今回のハンズオンでは説明していませんが,チャ
ネルには
・キャパシティ付き非同期チャネル
・チャネルのクローズ
・for ∼ range による連続受信
・select ∼ case による選択的送受信
などの機能があります。
展望
 ハンズオンの例題は説明のための単純なもので
したが,ゴルーチンとチャネルの応用としては,
サーバプログラムやパズルのソルバー,シミュ
レーションなどで使えるのではないでしょうか。
 クロージャと組み合わせることも出来ますし,
使い方を考えてみてください。
 プロジェクトオイラー(http://projecteuler.net/)
の問題を解くのに使ってみたりしています。

More Related Content

Viewers also liked

Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるMasakazu Muraoka
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)deris0126
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #goconHideyuki TAKEI
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間Shintaro Kitayama
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...Hidenori Takeshita
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12matsuo kenji
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets herokuKyosuke Kameda
 
ISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみたISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみたKen Gotoh
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すためにAkihiko Horiuchi
 
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてマイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてsz yudppp
 
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会Satoshi Noda
 
エンジニアと椅子
エンジニアと椅子エンジニアと椅子
エンジニアと椅子m1sogi
 
Gunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlGunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlInnami Satoshi
 
ちょっとだけさわってみる Go言語
ちょっとだけさわってみる Go言語ちょっとだけさわってみる Go言語
ちょっとだけさわってみる Go言語Satoshi Noda
 

Viewers also liked (19)

HighBatch
HighBatchHighBatch
HighBatch
 
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #gocon
 
Goを知る
Goを知るGoを知る
Goを知る
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
 
Go+revel
Go+revelGo+revel
Go+revel
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets heroku
 
ISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみたISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみた
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
 
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてマイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語について
 
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
 
Dockerぐらし!
Dockerぐらし!Dockerぐらし!
Dockerぐらし!
 
エンジニアと椅子
エンジニアと椅子エンジニアと椅子
エンジニアと椅子
 
Gunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlGunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http url
 
ちょっとだけさわってみる Go言語
ちょっとだけさわってみる Go言語ちょっとだけさわってみる Go言語
ちょっとだけさわってみる Go言語
 

Gdg神戸go言語ハンズオンマルチスレッドで遊ぼう20120825

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n