1
clowwindy 2013-01-30 14:26:36 +08:00 via iPhone
|
2
cyfdecyf 2013-02-01 11:33:40 +08:00 1
Go runtime 启动时会预先创建一些线程,如果存在 ready-to-run goroutine 找不到空闲的线程来执行,runtime 会创建新的线程。
目前的 runtime 不会限制创建线程的数量,所以如果有很多 block I/O 操作可能会导致创建出非常多的线程。如果遇到这样的问题可能需要用 goroutine pool 来限制。 Effective Go 里用 channel 实现 semaphore 的代码是个不错的例子,注意看最后一个例子 http://golang.org/doc/effective_go.html#channels Go 1.1 可能加入让用户指定创建的线程数上限的功能,但如果所有的线程都 block 在 I/O 上,整个程序就可能 block 住。用 goroutine pool 可以显示的只让执行 I/O 的 goroutine block,其他 goroutine 可以并发执行。 另外单独创建一个 goroutine 的内存占用大概在 4K,好像记得可以通过修改 go 代码来减小这个大小。 |
3
ryanking8215 2013-10-30 10:45:31 +08:00
go net.TcpConn已经是Nonblock了,如果有block,应该也是filesystem的吧。
另外goroutine要比线程轻量吧,从现象上说goroutine和线程是n对m的关系(n>m),是这样吧?那怎么了解goroutine的消耗呢?有的goroutine切换上下文在一个线程,有的是多个线程切换,时间和空间开销都是不一样的。这个怎么计算呢? |