多线程是我一直没触碰过的领域,特别是js一直都是单线程,不过h5里有个 Worker 不过我还没实际用过。
Go 提供了 Goroutines 实现并发程序,而且使用简单,他和传统线程还是有区别的,具体我也不知道,还没看到。
Goroutines
在Go语言中,每一个并发的执行单元叫作一个goroutine,其语法是在普通函数或方法前加上 go
关键词。
1 | f() // 调用 f(); 需要等待 f 执行完毕后才能继续执行 |
goroutine 实例是在主函数返回时才会结束,或者通过通信通知函数自己结束,其他没有任何方法可以结束。
Channels
channels 可以在 goroutine 直接进行通信,通过关键词 chan
来声明通道类型。
1 | ch := make(chan int) // ch 是一个 'chan int' 类型的channel |
一个channel有发送和接受两个主要操作,都是通过 <-
运算符传递。
1 | ch <- x // 一个发送声明 |
使用 close
关闭一个通道。
1 | close(ch) |
声明带缓存的通道。
1 | ch = make(chan int) // 无缓存 channel |
基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作。因为这个原因,无缓存Channels有时候也被称为同步Channels。
并发的循环
由于 goroutine 是无需等待的,使用在循环执行多个 goroutine 的时候,如果 main 退出了,所有的 goroutine 也就跟着退出,为了处理这个问题必须使用 channel,在每个 goroutine 内部向一个公共的 channel 发送事件,外部接受消息,直到所有 goroutine 完成为止。
并发的退出
在需要关闭并发的时候通过 channel 通知 goroutine 关闭。
小结
光语法层面还是容易理解,但是后面讲的东西有点云里雾里的,一下子理解不了。
需要之后实践中摸索理解。