写go语言并发需要注意的几点: 1. golang 1.2版本 goroutine的runtime.GOMAXPROCS 如果没有被定义,默认是1,从1.5之后改为默认是runtime.CpuNum(),go底层其实是并发GOMAXPROCS 个线程,然后进行并发。 但是并发也是每个goroutine分先后进行运行,并不是真正的并发轮询,所以必须让goroutine的加入轮询调度runtime.Gosched(),保证所有goroutine齐头并进,以下面程序为例,如果不加入 go的轮询调度,由于say函数goroutine是死循环,所以永远不会进行上下文切换,也就导致了永远输出不了world,主线程会一直占据着cpu时间片。 package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() //让执行此函数的goroutine进行go的轮询调度 fmt.Println(s) } } func main() { go say("world") say("hello") }