概览
· Go里面实现并发有两种方式:
协程方式:goroutine+channel,支持CSP
线程方式:共享内存
协程初步
Go里面每一个并发执行的单元叫做一个协程(goroutine)。在Go里面对于一个函数的调用有两种方式:
· f() 常规的函数调用,将在当前协程里面调用f()并等待其返回,之后继续向后执行
· go f() 开启一个协程执行f()函数,并迅速返回到当前协程继续向后执行
main函数是由系统调起的,运行在主协程(main goroutine)里面。
package main
import (
"fmt"
"bufio"
"os"
)
func print_hello(id string) {
for i := 0; i < 5; i++ {
fmt.Println(id)
}
}
func main() {
go print_hello("fuck")
print_hello("main")
inputReader := bufio.NewReader(os.Stdin)
inputReader.ReadString('\n')
}
main
main
main
main
main
main
main
main
main
main
fuck
fuck
fuck
fuck
fuck
fuck
fuck
fuck
fuck
fuck
a
协程的重要特性
· 主函数返回时,所有协程被直接打断,程序退出。
· 没有任何方法使得一个协程可以打断另一个协程的执行。(只有一种情况除外,就是在程序退出时,主协程可以打断其他协程)