golang入门(4):并发
Go语言在并发编程上有一系列的优势,其 goroutine 机制使得编写并发程序变得简单高效。本篇文章将介绍如何使用 goroutine,以及如何利用 channel 实现不同 goroutine 之间的通信。
goroutine
goroutine 是 Go 语言的并发执行单元,它可以由 go 语句创建,底层实现由 Go 的运行时系统完成。一个程序可以同时存在多个 goroutine,每个 goroutine 只会占用很小的内存空间。相比于传统的线程,goroutine 更加轻量级且高效。
使用 go 语句创建 goroutine 只需在函数调用前面加上 go 即可。例如:
func f() {
// 一些代码
}
go f() // 创建一个新的 goroutine 并执行 f 函数
channel
goroutine 之间的通信通常使用 channel 实现。channel 是一种用于在 goroutine 之间传递数据的数据类型,类似于 Unix 中的管道。 channel 有两种模式:同步模式和异步模式。
同步模式表示在发送数据时,发送方会一直等待接收方接收数据后才会释放控制权,而异步模式则不会等待,发送方会尽力发送数据,即使没有接收方。 channel 有两种类型:单向 channel 和双向 channel。
定义 channel 使用 make
函数:
ch := make(chan int) // 双向 channel
ch := make(chan<- int) // 单向 channel,只能用于发送数据
ch := make(<-chan int) // 单向 channel,只能用于接收数据
发送和接收数据使用 <-
操作符:
s := <-ch // 从 channel 接收数据
ch <- s // 向 channel 发送数据
下面是一个示例:
func square(ch chan<- int, x int) {
ch <- x * x
}
// 计算平方和
func sumSquares(ch <-chan int) int {
sum := 0
for {
s, ok := <-ch
if !ok {
break
}
sum += s
}
return sum
}
func main() {
ch := make(chan int)
go square(ch, 3)
go square(ch, 4)
go square(ch, 5)
sum := sumSquares(ch)
fmt.Println(sum) // 输出 50
}
在示例中,我们创建了三个 goroutine,每个 goroutine 计算一个数字的平方值,将结果发送给一个 channel。sumSquares 函数从 channel 中接收这些值,并计算它们的和。
总结一下,Go 语言的并发编程非常简单高效,使用 goroutine 和 channel 可以轻松实现不同 goroutine 之间的通信和数据同步。对于需要高并发的场景,Go 语言是一个值得推荐的选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang入门(4):并发 - Python技术站