Goruntine是否有必要做个pool?

2013-01-29 13:01:16 +08:00
 blahnice
因为有个百万级别个数的分批i/o任务,通常一般都是自己做个thread或者process pool去做worker。而如果改用go去做,自己对golang的go协程也不是特别了解,因此不太了解如果用go程做并行最优化、切换上下文短的并行模型,该如何去做。各位对此有什么建议?
能有个example代码最好了,thx
2667 次点击
所在节点    Go 编程语言
3 条回复
clowwindy
2013-01-30 14:26:36 +08:00
cyfdecyf
2013-02-01 11:33:40 +08:00
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 代码来减小这个大小。
ryanking8215
2013-10-30 10:45:31 +08:00
go net.TcpConn已经是Nonblock了,如果有block,应该也是filesystem的吧。
另外goroutine要比线程轻量吧,从现象上说goroutine和线程是n对m的关系(n>m),是这样吧?那怎么了解goroutine的消耗呢?有的goroutine切换上下文在一个线程,有的是多个线程切换,时间和空间开销都是不一样的。这个怎么计算呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/59149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX