阅读量:25
在 Linux 系统中,使用 Golang 实现并发控制可以通过以下几种方式:
- Goroutines:Golang 的轻量级线程,可以轻松创建成千上万个。通过
go
关键字启动一个新的 Goroutine。
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)
}
- Channels:用于在 Goroutines 之间传递数据。可以将其视为一种同步机制,以确保 Goroutines 按照预期的顺序执行。
package main
import (
"fmt"
"time"
)
func printNumbers(c chan int) {
for i := 1; i <= 5; i++ {
c <- i
time.Sleep(1 * time.Second)
}
close(c)
}
func main() {
c := make(chan int)
go printNumbers(c)
for num := range c {
fmt.Printf("Number: %d\n", num)
}
}
- Mutexes:互斥锁,用于确保在同一时间只有一个 Goroutine 访问共享资源。
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func incrementCounter() {
mutex.Lock()
defer mutex.Unlock()
counter++
time.Sleep(1 * time.Second)
}
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
incrementCounter()
wg.Done()
}()
}
wg.Wait()
fmt.Printf("Counter: %d\n", counter)
}
- Select:用于在多个通道操作中进行选择。可以将其视为一种同步机制,以确保 Goroutines 按照预期的顺序执行。
package main
import (
"fmt"
"time"
)
func printNumbers(c chan int) {
for i := 1; i <= 5; i++ {
c <- i
time.Sleep(1 * time.Second)
}
close(c)
}
func main() {
c1 := make(chan int)
c2 := make(chan int)
go printNumbers(c1)
go printNumbers(c2)
for i := 0; i < 10; i++ {
select {
case num := <-c1:
fmt.Printf("Number from c1: %d\n", num)
case num := <-c2:
fmt.Printf("Number from c2: %d\n", num)
}
}
}
这些方法可以帮助你在 Linux 系统中使用 Golang 实现并发控制。根据你的需求,可以选择合适的方法来确保 Goroutines 之间的同步和数据传递。