Go语言中如何实现协程同步

如果只有一个工作协程,需要主协程等待工作协程完成任务,可以使用通道来实现同步。

示例如下:

package main

import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Print("working...")
    // 忙一会..
    time.Sleep(time.Second)
    fmt.Println("done")

    // 通知主协程任务完成
    done <- true
}

func main() {

    // 创建非缓冲通道(ps:缓冲通道也可以完成这项任务)
    done := make(chan bool)
    go worker(done)

    // 阻塞等待worker协程任务完成
    <-done
}

不了解通道可以看这篇文章 Go语言的缓冲通道和非缓冲通道

如果需要等待有多个协程,一般有两种方式:使用缓冲通道、WaitGroup

1.使用缓冲通道阻塞等待所有协程的完成信息

示例如下:

package main

import (
	"fmt"
	"time"
)

func main() {
    // 创建布尔通道
	done := make(chan bool)

	for i := 0; i < 5; i++ {
		go func(done chan bool) {
			fmt.Println(i, "start working...")
			time.Sleep(2 * time.Second)
			fmt.Println(i, "finish working...")

            // 通知主协程任务完成
			done <- true
		}(done)
	}

    // 循环接收所有协程完成信息
	for i := 0; i < 5; i++ {
		<-done
	}
}
  1. 使用 WaitGroup

使用WaitGroup需要导入sync

示例如下:

package main

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

func main() {
    // 声明 WaitGroup
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
        // 递增 WaitGroup 的计数器。
		wg.Add(1)

        // 1.22版本前的GoLang需要添加下面语句避免所有闭包共享单一不变的变量,详见 https://go.dev/doc/faq#closures_and_goroutines
        // i := i

        // 以匿名函数形式运行协程
		go func(id int) {
			fmt.Println(id, "start working..")
            // 忙一会...
			time.Sleep(2 * time.Second)
			fmt.Println(id, "finish working..")

            // 在函数将要结束时,递减 WaitGroup 的计数器。
            // defer 会保证当函数返回时,执行紧跟 defer 的函数语句。
			defer wg.Done()
		}(i)
	}

    // 阻塞等待 WaitGroup 的计数器恢复为0,即所有协程工作完成。
	wg.Wait()
}

相关推荐

  1. Go语言如何实现同步

    2024-04-30 23:36:01       13 阅读
  2. Go语言使用

    2024-04-30 23:36:01       35 阅读
  3. go实现

    2024-04-30 23:36:01       17 阅读
  4. <span style='color:red;'>go</span> <span style='color:red;'>协</span><span style='color:red;'>程</span>

    go

    2024-04-30 23:36:01      6 阅读
  5. Go实现简单的池(通过channel实现

    2024-04-30 23:36:01       19 阅读
  6. go语言GMP模式介绍以及案例展示

    2024-04-30 23:36:01       25 阅读
  7. GO语言调度原理和使用方法

    2024-04-30 23:36:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 23:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 23:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 23:36:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 23:36:01       20 阅读

热门阅读

  1. 2 Spring IoC

    2024-04-30 23:36:01       13 阅读
  2. 01 C

    2024-04-30 23:36:01       12 阅读
  3. MySql 函数和表达式索引

    2024-04-30 23:36:01       12 阅读
  4. 【skynet】 网络编程之回显服务器

    2024-04-30 23:36:01       12 阅读