GO并发操作 | 青训营

50 阅读1分钟

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

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

  • Goroutine(协程): go中使用Goroutine来实现并发concurrently。Goroutine是Go语言特有的名词。区别于进程Process,线程Thread,协程Coroutine,因为Go语言的创造者们觉得和他们是有所区别的,所以专门创造了Goroutine。
  • Channel(通道): - channel是Go语言中各个并发结构体(goroutine)之前的通信机制。 通俗的讲,就是各个goroutine之间通信的”管道“,有点类似于Linux中的管道。

示例代码:使用 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来接受通道分发的任务并发的处理这些任务,处理结束后集合回到主程序。

总结

go语言的并发操作为处理并发任务提供了更加简洁方便的方法,通过 Goroutine 和通道可以将任务拆分成更小的部分,在 Goroutine 中传输。