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