GO并发操作 | 青训营

56 阅读2分钟

Go 语言以其出色的并发支持而闻名,它的并发模型使得处理多个任务变得高效而简单。以下是关于 Go 语言并发操作的笔记,涵盖了并发的基本概念以及一些示例代码。

Go 语言并发操作的基本概念

并发是指同时处理多个任务的能力,Go 语言通过 goroutine 和 channel 来实现并发操作。

  • Goroutine(协程): Goroutine 是 Go 语言中的轻量级线程,允许并发地执行函数或方法。与传统的线程相比,Goroutine 更加高效,占用的资源更少。可以使用 go 关键字启动一个新的 Goroutine。
  • Channel(通道): Channel 是 Goroutine 之间进行通信和数据交换的一种机制。它可以用于在不同的 Goroutine 之间传递数据,确保并发操作的安全性。通过使用 make 创建一个通道,可以通过 <- 操作符发送和接收数据。

示例代码:使用 Goroutine 和 Channel 实现并发

假设我们有一个任务列表,要在多个 Goroutine 中并发地完成这些任务,并通过 Channel 进行通信。

package main

import (
	"fmt"
	"time"
)

func worker(id int, tasks <-chan string, results chan<- string) {
	for task := range tasks {
		// 模拟任务处理
		time.Sleep(time.Second)
		result := fmt.Sprintf("Worker %d completed task: %s", id, task)
		results <- result
	}
}

func main() {
	taskCount := 10
	workerCount := 3

	tasks := make(chan string, taskCount)
	results := make(chan string, taskCount)

	for i := 1; i <= workerCount; i++ {
		go worker(i, tasks, results)
	}

	for i := 1; i <= taskCount; i++ {
		tasks <- fmt.Sprintf("Task %d", i)
	}

	close(tasks)

	for i := 1; i <= taskCount; i++ {
		result := <-results
		fmt.Println(result)
	}
}

在这个示例中,我们创建了一个任务列表,然后启动了多个 Goroutine 来并发地处理这些任务。通过使用通道,任务被分发给 Goroutine 进行处理,最终结果也通过通道返回给主程序。

总结

Go 语言的并发模型为处理并发任务提供了一种简单、高效的方式。通过 Goroutine 和 Channel,您可以实现并发操作,将任务拆分成更小的部分,并在多个 Goroutine 之间进行通信。