Go 学习笔记(八)- Goroutines和Channels

多线程是我一直没触碰过的领域,特别是js一直都是单线程,不过h5里有个 Worker 不过我还没实际用过。
Go 提供了 Goroutines 实现并发程序,而且使用简单,他和传统线程还是有区别的,具体我也不知道,还没看到。

Goroutines

在Go语言中,每一个并发的执行单元叫作一个goroutine,其语法是在普通函数或方法前加上 go 关键词。

1
2
f()    // 调用 f(); 需要等待 f 执行完毕后才能继续执行
go f() // 创建 goroutine 来调用 f(); 不需要等待 (类似js里的异步,不需要等待)

goroutine 实例是在主函数返回时才会结束,或者通过通信通知函数自己结束,其他没有任何方法可以结束。

Channels

channels 可以在 goroutine 直接进行通信,通过关键词 chan 来声明通道类型。

1
ch := make(chan int) // ch 是一个 'chan int' 类型的channel

一个channel有发送和接受两个主要操作,都是通过 <- 运算符传递。

1
2
3
ch <- x  // 一个发送声明
x = <-ch // 接收声明并赋值给 x
<-ch // 接收声明并丢弃结果

使用 close 关闭一个通道。

1
close(ch)

声明带缓存的通道。

1
2
3
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 关闭。

小结

光语法层面还是容易理解,但是后面讲的东西有点云里雾里的,一下子理解不了。
需要之后实践中摸索理解。