go的协程是基于用户态的线程,CPU并不知道协程的存在,非常轻量。
创建的语法 go function();
goroutine(协程)占用的内存比java、c的线程少。很轻易的做到上百万并发。
并且协程的切换比线程切换开销小很多,性能比较好。协程和channel配合使用(类似生产者消费者模型可以做到很高性能的web server。),go目前作为云计算主要语言还是很厉害的
以下列子创建了2个协程,执行结果:说明协程是并行的,并且当主线程退出,协程也会退出
begin 0s
协程2: 1, 0s
协程1: H , 0s
协程1: E , 10.9392ms
协程2: 2, 15.0566ms
协程1: L , 21.6407ms
协程2: 3, 30.142ms
协程1: L , 32.1343ms
协程1: O , 42.6038ms
协程2: 4, 45.579ms
end 100.1094ms
package main
import (
"fmt"
"time"
)
/**
协程并行
*/
func printChar(s string) {
for _, c := range s {
fmt.Printf("协程1: %c , %v\n", c, time.Since(start))
time.Sleep(10 * time.Millisecond)
}
}
func printArr(s []int) {
for _, d := range s {
fmt.Printf("协程2: %d, %v\n", d, time.Since(start))
time.Sleep(15 * time.Millisecond)
}
}
var start time.Time
func init() {
start = time.Now()
}
func main() {
fmt.Println("begin", time.Since(start))
go printChar("HELLO") //协程1
go printArr([]int{1, 2, 3, 4}) //协程2
time.Sleep(100 * time.Millisecond)
fmt.Println("end", time.Since(start))
}