在Linux系统中,Go语言的并发处理是通过goroutines和channels来实现的。goroutines是Go语言中轻量级的线程,它们在同一个操作系统线程上运行,共享内存空间。channels则用于在goroutines之间传递数据。
以下是一些关于Go程序并发处理的基本概念:
go即可。例如:package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Printf("Number: %d\n", i)
time.Sleep(1 * time.Second)
}
}
func main() {
go printNumbers()
time.Sleep(6 * time.Second)
}
在这个例子中,我们创建了一个名为printNumbers的goroutine,它会打印数字1到5,每次打印之间间隔1秒。在main函数中,我们使用go关键字启动了这个goroutine。
make函数即可。例如:package main
import (
"fmt"
)
func sum(numbers []int, c chan int) {
sum := 0
for _, num := range numbers {
sum += num
}
c <- sum // 将结果发送到channel
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
c := make(chan int)
go sum(numbers, c)
result := <-c // 从channel接收结果
fmt.Printf("Sum: %d\n", result)
}
在这个例子中,我们创建了一个名为sum的goroutine,它会计算一个整数切片的和,并将结果发送到名为c的channel。在main函数中,我们从channel接收结果并打印出来。
sync.WaitGroup、sync.Mutex和sync.Cond等。sync.WaitGroup:用于等待一组goroutines完成。例如:package main
import (
"fmt"
"sync"
"time"
)
func printNumbers(wg *sync.WaitGroup) {
defer wg.Done() // 在函数结束时调用Done(),表示goroutine已完成
for i := 1; i <= 5; i++ {
fmt.Printf("Number: %d\n", i)
time.Sleep(1 * time.Second)
}
}
func main() {
var wg sync.WaitGroup
wg.Add(1) // 增加WaitGroup的计数器
go printNumbers(&wg)
wg.Wait() // 等待所有goroutines完成
}
sync.Mutex:用于确保在同一时间只有一个goroutine可以访问共享资源。例如:package main
import (
"fmt"
"sync"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // 加锁
counter++ // 修改共享资源
mutex.Unlock() // 解锁
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
// 等待一段时间,确保所有goroutines完成
time.Sleep(1 * time.Second)
fmt.Printf("Counter: %d\n", counter)
}
通过使用goroutines和channels,你可以在Linux系统中轻松地实现Go程序的并发处理。这些特性使得Go语言成为构建高性能、可扩展的后端服务的理想选择。