linux

Golang在Linux上的并发编程如何实现

小樊
40
2025-08-25 14:22:24
栏目: 编程语言

在Golang中,实现Linux上的并发编程主要依赖于Go语言的并发原语,如goroutines和channels。以下是一些关键概念和示例,帮助你在Linux上使用Golang进行并发编程。

1. Goroutines

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")
}

2. Channels

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")
}

3. Sync包

Go语言的sync包提供了一些同步原语,如MutexWaitGroupCond,用于更复杂的并发控制。

Mutex

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)
}

WaitGroup

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")
}

4. Select语句

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语言的并发模型设计简洁且强大,能够轻松处理复杂的并发任务。

0
看了该问题的人还看了