Sunday, February 07, 2010

goroutine強制終了

最近goにはまっています。
チャンネルという新しい同期、非同期通信の仕組みや関数の複数値返し、
待ってたものがやっときたという感じです。

ずんWiki - golang/逆引き/goroutineを終了するには

goで遊んでいてわからなくなったポイントがありました。
go func()で簡単に走らせることができるgoのスレッド、goroutine。
自分のスレッドを強制的に終わらせるために用意された、グローバルな関数がありました。
runtime.Goexit()
上記を参照しました。

下記のようなときに使えます。

例:チャンネルを使ってgoroutineが終わるのを待ちますが、
  強制終了されちゃうとチャンネル受信ができないので終われません。
  ひたすら待ち続けてプロセスが死んじゃいます、という例:


package main
import (
"fmt";
"runtime"
)
var ch= make(chan int, 1);
func main() {
go func() {
func() {
fmt.Printf("Stop goroutine1\n");
runtime.Goexit();
}();
ch <- 1;
}();
<-ch;
}



出力:エラー吐いてプロセス死亡・・・


package main
import (
"fmt";
// "runtime"
)
var ch= make(chan int, 1);
func main() {
go func() {
func() {
fmt.Printf("Stop goroutine1\n");
// runtime.Goexit();
}();
ch <- 1;
}();
<-ch;
}


出力:Stop goroutine1

久しぶりのラーメン

晩御飯に、近くのラーメン屋さんに行きました。
いきなりラーメンを食べたいなどと妻が言うもので、
自分もすっかりラーメン気分になり、
開店前にお店についてしまう始末。
そこは、webでは結構評判がよかったお店。
食べた後、妻は「麺はよかったがスープは微妙」とのこと。
自分はスープが冷たかったのが微妙と思いました。
今日は、ゆったりの土曜日でした。