※ 引述《LinuxKernel (Linus Torvalds)》之铭言:
: 不敢说会写,只能说略懂,以下简单分享。
: 先说觉得好的地方
: 1. 对 non-blocking 的封装
: 大家都知道在 C/C++ 底下要写出高并发性能的 server 很多细节是很麻烦的
: 你可能说写 server 不就开个 socket 搭配 fork 多么直观
: 但现实是要达到好的性能就需要 select、epoll、kqueue 甚至 thread pool 之类的东西
: 但 non-blocking 的世界毕竟不是那么直观
: Go 强的地方就在于他让你用很直观的 blocking 写法
: 一个 client 进来你也就像 fork 一样给他开个 goroutine
: 但实际上它底层 runtime 就是用 epoll/kqueue 帮你做掉
: 也帮你做这些 lightweight thread 的 scheduling
: 当然 C/C++ 的世界也有类似的 library 可以办到,像是 Boost.Fiber
: 但 Go 里面用 goroutine 搭配 channel 感觉就是优雅了些
: 不过 goroutine 还是有可能踩到坑的
: 例如 goroutine 就永远卡在那边,这点可以去了解一下它 scheduling 的实作
goroutine应该说是preemptible blocking. epoll是io的部份,跟goroutine
无关。
Boost.fiber 是coroutine. 打个比喻就是win3.1的 cooperative multitasking.
goroutine 是 win95 的preemptive multitasking.完全不同等级的概念。
goroutine应该是模仿Erlang的process. channel就是message passing.
简单来讲golang就是better c + gc + concurrency.
goroutine 其实是golang的最重要功能。写过Multithread的人都知道,
尽量不要share memory. Lock carfully(avoid 2 locks if possible),
wait as little as possible.
Multithread是very HARD(tm)的,bug非常难找,真的极少人写的好。
写过Erlang的人都知道, concurrency is SIMPLE. golang也是
同样的.
为什么goroutine is SIMPLE, multithread is HARD. 重点就是channel,
(Message Passing). 只要不要share data. concurrency就简单了。
我们都知道Moore's Law is dead. 以后multi-core只会越来越多,
cpu的frequency不会增加太多。Concurrency programming只会越来越重要,
Erlang证明它的concurrency programming model work. Golang 是
google想办法把concurrency programming 带到大家能用的语言上来。
我觉得golang用的人会越来越多。它其实是真的c的后继语言。
大大推荐。
-补充一下