Go语言的Goroutine并发

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验旨在测试你对 Go 语言中 goroutine 的理解。Goroutine 是轻量级的执行线程,允许函数并发执行。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/goroutines("Goroutines") subgraph Lab Skills go/goroutines -.-> lab-15479{{"Go语言的Goroutine并发"}} end

协程

本实验要解决的问题是创建并运行协程来并发执行函数。

  • f 函数应将其输入字符串和一个计数器变量打印三次。
  • main 函数应同步调用 f 函数,并将 “direct” 和一个计数器变量打印三次。
  • main 函数应使用协程异步调用 f 函数,并将 “goroutine” 和一个计数器变量打印三次。
  • main 函数应启动一个协程来执行一个打印消息的匿名函数。
  • main 函数应在打印出 “done” 之前等待协程完成执行。
## 当我们运行这个程序时,我们首先会看到阻塞调用的输出,然后是两个协程的输出。协程的输出可能会交错,因为Go运行时会并发运行协程。
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

## 接下来我们将看看并发Go程序中协程的一个补充:通道。

下面是完整代码:

// 协程是轻量级的执行线程。

package main

import (
	"fmt"
	"time"
)

func f(from string) {
	for i := 0; i < 3; i++ {
		fmt.Println(from, ":", i)
	}
}

func main() {

	// 假设我们有一个函数调用 `f(s)`。以下是我们通常调用它的方式,同步运行它。
	f("direct")

	// 要在协程中调用这个函数,使用 `go f(s)`。这个新的协程将与调用它的协程并发执行。
	go f("goroutine")

	// 你也可以为一个匿名函数调用启动一个协程。
	go func(msg string) {
		fmt.Println(msg)
	}("going")

	// 我们的两个函数调用现在在不同的协程中异步运行。等待它们完成(对于更健壮的方法,使用 [WaitGroup](waitgroups))。
	time.Sleep(time.Second)
	fmt.Println("done")
}

总结

在本实验中,你学习了如何创建和运行协程来并发执行函数。你还学习了如何启动一个协程来执行匿名函数,以及如何等待协程完成执行。