函数无阻塞测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import "fmt" func sum(values []int, myChan chan int) { sum := 0 for _, value := range values { sum += value } fmt.Println("Sum:", sum) myChan <- sum } func main() { myChan := make( chan int,2) values := []int {1,2,3,5,5,4,23,4,4,233,2,233} go sum(values,myChan) go sum(values[:1],myChan) sum1,sum2 := <-myChan, <-myChan fmt.Println("Result:",sum1,sum2,sum1+sum2) } |
函数有阻塞测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import "fmt" import "time" var quit chan int func foo(id int) { fmt.Println(id) time.Sleep(time.Second) quit <- 0 } func main() { count := 1000 quit = make(chan int, count) for i := 0; i < count; i++ { go foo(i) } for i :=0 ; i < count; i++ { <- quit } } |
如果当前goroutine不发生阻塞,它是不会让出CPU给其他goroutine的, 所以例子一中的输出会是一个一个goroutine进行的,而sleep函数则阻塞掉了 当前goroutine, 当前goroutine主动让其他goroutine执行, 所以形成了逻辑上的并行, 也就是并发。
真正并行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import ( "fmt" "runtime" ) var quit chan int = make(chan int) func loop() { for i := 0; i < 100; i++ { //为了观察,跑多些 fmt.Printf("%d ", i) } quit <- 0 } func main() { runtime.GOMAXPROCS(2) // 最多使用2个核 go loop() go loop() for i := 0; i < 2; i++ { <- quit } } |
runtime调度器
runtime调度器是个很神奇的东西,但是我真是但愿它不存在,我希望显式调度能更为自然些,多核处理默认开启。
关于runtime包几个函数:
Gosched
让出cpuNumCPU
返回当前系统的CPU核数量GOMAXPROCS
设置最大的可同时使用的CPU核数Goexit
退出当前goroutine(但是defer语句会照常执行)
参考:
http://blog.csdn.net/kjfcpua/article/details/18265461