GAを使った推論エンジンを、無限ループで回し続けながら(止めないで)、変数の変更やら、パラメータの変更を突っ込みたいんだけど、その「割り込み」方法が思いつきませんでした。たしか select, caseを使ったやり方があって、defaultの使い方がキモだったようなものがあったような気がして、ちょっとテストプログラム書いてみましたところ、動いたみたいなので、メモの残しておきます。
// go run main2.go
package main
import (
"fmt"
"time"
)
var ch1 chan interface{}
var ch2 chan interface{}
func main() {
ch1 = make(chan interface{}) // チャネルの初期化
ch2 = make(chan interface{}) // チャネルの初期化(ここでは使っていない)
go loop()
for i := 0; i < 5; i++ {
time.Sleep(3 * time.Second) // 3秒待つ
fmt.Println("send")
ch1 <- i
}
}
func loop() {
for {
time.Sleep(1 * time.Second) // 1秒待つ
fmt.Println("loop")
//チャネルからメッセージの到着を確認する
select {
case i := <-ch1:
fmt.Println("ch1:", i)
case <-ch2:
fmt.Println("ch2")
default:
//fmt.Println("No value")
}
}
}
で、この最後の"default"をコメントアウトすると、selectが無限待ちになってしまう(チャネルからメッセージが飛んでこないとロックしてしまう)ので注意して下さい。
コメントアウトした結果↓
# チャネルからイベント入ったら、初期設定のルーチンまで強制的に飛ばしてしまおうと思っているのですが、golangに、"goto"ってあるのかなぁ・・・