V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
blahnice
V2EX  ›  Go 编程语言

Goruntine是否有必要做个pool?

  •  
  •   blahnice · 2013-01-29 13:01:16 +08:00 · 2786 次点击
    这是一个创建于 4314 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为有个百万级别个数的分批i/o任务,通常一般都是自己做个thread或者process pool去做worker。而如果改用go去做,自己对golang的go协程也不是特别了解,因此不太了解如果用go程做并行最优化、切换上下文短的并行模型,该如何去做。各位对此有什么建议?
    能有个example代码最好了,thx
    3 条回复    1970-01-01 08:00:00 +08:00
    clowwindy
        1
    clowwindy  
       2013-01-30 14:26:36 +08:00 via iPhone
    cyfdecyf
        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 代码来减小这个大小。
    ryanking8215
        3
    ryanking8215  
       2013-10-30 10:45:31 +08:00
    go net.TcpConn已经是Nonblock了,如果有block,应该也是filesystem的吧。
    另外goroutine要比线程轻量吧,从现象上说goroutine和线程是n对m的关系(n>m),是这样吧?那怎么了解goroutine的消耗呢?有的goroutine切换上下文在一个线程,有的是多个线程切换,时间和空间开销都是不一样的。这个怎么计算呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5855 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.