在Golang中,实现Linux上的并发编程主要依赖于Go语言的并发原语,如goroutines和channels。以下是一些关键概念和示例,帮助你在Linux上使用Golang进行并发编程。
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() // 启动一个新的goroutine
time.Sleep(6 * time.Second) // 等待goroutine完成
fmt.Println("Main function finished")
}
Channels是用于在goroutines之间进行通信和同步的原语。它们提供了一种安全的方式来传递数据。
package main
import (
"fmt"
"time"
)
func producer(ch chan<- int) {
for i := 1; i <= 5; i++ {
ch <- i // 将数据发送到channel
time.Sleep(1 * time.Second)
}
close(ch) // 关闭channel
}
func consumer(ch <-chan int) {
for num := range ch {
fmt.Printf("Received: %d\n", num)
}
}
func main() {
ch := make(chan int) // 创建一个channel
go producer(ch) // 启动生产者goroutine
go consumer(ch) // 启动消费者goroutine
time.Sleep(6 * time.Second) // 等待goroutines完成
fmt.Println("Main function finished")
}
Go语言的sync包提供了一些同步原语,如Mutex、WaitGroup和Cond,用于更复杂的并发控制。
package main
import (
"fmt"
"sync"
"time"
)
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
fmt.Printf("Counter: %d\n", counter)
}
func main() {
for i := 0; i < 5; i++ {
go increment()
time.Sleep(100 * time.Millisecond)
}
time.Sleep(1 * time.Second)
fmt.Printf("Final Counter: %d\n", counter)
}
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers done")
}
select语句用于在多个channel操作中进行选择,类似于switch语句,但用于channel。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(1 * time.Second)
ch1 <- "from ch1"
}()
go func() {
time.Sleep(2 * time.Second)
ch2 <- "from ch2"
}()
for i := 0; i < 2; i++ {
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}
}
通过这些基本概念和示例,你可以在Linux上使用Golang实现高效的并发编程。Go语言的并发模型设计简洁且强大,能够轻松处理复杂的并发任务。