Go runtime 启动时会预先创建一些线程,如果存在 ready-to-run goroutine 找不到空闲的线程来执行,runtime 会创建新的线程。
目前的 runtime 不会限制创建线程的数量,所以如果有很多 block I/O 操作可能会导致创建出非常多的线程。如果遇到这样的问题可能需要用 goroutine pool 来限制。
Effective Go 里用 channel 实现 semaphore 的代码是个不错的例子,注意看最后一个例子
http://golang.org/doc/effective_go.html#channelsGo 1.1 可能加入让用户指定创建的线程数上限的功能,但如果所有的线程都 block 在 I/O 上,整个程序就可能 block 住。用 goroutine pool 可以显示的只让执行 I/O 的 goroutine block,其他 goroutine 可以并发执行。
另外单独创建一个 goroutine 的内存占用大概在 4K,好像记得可以通过修改 go 代码来减小这个大小。