読者です 読者をやめる 読者になる 読者になる

Go で goroutine

go で関数の実行を並列化できる(非同期化が正しい?)。結果は channel というものを使って取り扱うのかな。このあたりは Erlang ぽい?
あまり意味のない例だけど、sleep を並列にするとこんなかんじ。

[Wed Nov 11 20:29:29 2009] sleep 1 seconds
[Wed Nov 11 20:29:29 2009] sleep 2 seconds
[Wed Nov 11 20:29:29 2009] sleep 3 seconds
[Wed Nov 11 20:29:30 2009] wake up 1
[Wed Nov 11 20:29:31 2009] wake up 2
[Wed Nov 11 20:29:32 2009] wake up 3

ソースコード

package main
import (
	"fmt";
	"time";
);

func main() {
	ch := make(chan int64);
	var i int64;
	for i = 1; i <= 3; i++ {
		go sleep(ch, i);
	}
	for i = 1; i <= 3; i++ {
		num := <-ch; // channel から結果取り出し
		fmt.Printf("[%s] wake up %d\n", now(), num);
	}
}

func sleep ( ch chan int64, n int64 ) {
	fmt.Printf("[%s] sleep %d seconds\n", now(), n);
	time.Sleep( n * 1e9 );
	ch <- n; // channel に結果送信
}

func now () string {
	return time.LocalTime().Asctime();
}

並列フィボナッチ数というのもやってみたんだけど、再帰のたびに channel を作ってたら、28 を求めるぐらいでメモリ食いすぎて死亡。これは仕方ないわな。
http://gist.github.com/231881