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