centos

CentOS中Golang如何实现并发控制

小樊
51
2025-07-24 17:31:33
栏目: 编程语言

在CentOS系统中使用Golang实现并发控制,主要依赖于Go语言的并发原语,如goroutines和channels。以下是一些基本的并发控制方法:

  1. goroutines:Go语言中的轻量级线程,可以用来执行并发任务。

  2. channels:用于在goroutines之间传递数据,也可以用来同步goroutines的执行。

  3. sync包:提供了一些工具来帮助管理并发,例如WaitGroup、Mutex、Cond等。

下面是一个简单的例子,展示了如何在CentOS中使用Golang进行并发控制:

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // 确保在函数结束时调用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

	// 启动多个goroutines
	for i := 1; i <= 5; i++ {
		wg.Add(1) // 增加WaitGroup的计数器
		go worker(i, &wg)
	}

	// 等待所有goroutines完成
	wg.Wait()
	fmt.Println("All workers done")
}

在这个例子中,我们使用了sync.WaitGroup来等待一组goroutines完成。每个worker函数在执行完毕后都会调用wg.Done()来减少WaitGroup的计数器。主函数通过调用wg.Wait()来阻塞,直到所有的goroutines都调用了wg.Done(),这时主函数才会继续执行并打印"All workers done"。

如果你需要更细粒度的控制,比如限制同时运行的goroutines数量,可以使用带缓冲的channels作为信号量:

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup, sem chan struct{}) {
	sem <- struct{}{} // 获取一个信号量
	defer func() { <-sem }() // 释放信号量

	fmt.Printf("Worker %d starting\n", id)
	time.Sleep(time.Second) // 模拟耗时操作
	fmt.Printf("Worker %d done\n", id)
}

func main() {
	var wg sync.WaitGroup
	sem := make(chan struct{}, 2) // 创建一个缓冲大小为2的信号量

	// 启动多个goroutines
	for i := 1; i <= 5; i++ {
		wg.Add(1)
		go worker(i, &wg, sem)
	}

	wg.Wait()
	fmt.Println("All workers done")
}

在这个例子中,我们创建了一个缓冲大小为2的信号量sem。每个worker在开始工作之前都会向sem发送一个空结构体,如果sem已满,则发送操作会阻塞,直到有空间可用。这样就限制了最多只有两个worker可以同时运行。

这些是Golang中实现并发控制的一些基本方法。根据你的具体需求,可能还需要使用其他同步机制,如sync.Mutex来保护共享资源,避免竞态条件。

0
看了该问题的人还看了