【Go channel如何控制goroutine并发执行顺序?】

多个goroutine并发执行时,每一个goroutine抢到处理器的时间点不一致,gorouine的执行本身不能保证顺序。即代码中先写的gorouine并不能保证先执行

思路:使用channel进行通信通知,用channel去传递信息,从而控制并发执行顺序

go 复制代码
package main

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

var wg sync.WaitGroup

func main() {
    ch1 := make(chan struct{}, 1)
    ch2 := make(chan struct{}, 1)
    ch3 := make(chan struct{}, 1)
    ch1 <- struct{}{}
    wg.Add(3)
    start := time.Now().Unix()
    go print("gorouine1", ch1, ch2)
    go print("gorouine2", ch2, ch3)
    go print("gorouine3", ch3, ch1)
    wg.Wait()
    end := time.Now().Unix()
    fmt.Printf("duration:%d\n", end-start)
}

func print(gorouine string, inputchan chan struct{}, outchan chan struct{}) {
    // 模拟内部操作耗时
    time.Sleep(1 * time.Second)
    select {
    case <-inputchan:
        fmt.Printf("%s\n", gorouine)
        outchan <- struct{}{}
    }
    wg.Done()
}
  • 输出:
bash 复制代码
gorouine1
gorouine2
gorouine3
duration:1

本文节选于Go合集《常见面试题汇总》GOLANG ROADMAP 一个专注Go语言学习、求职的社区。

相关推荐
怪我冷i10 小时前
使用vscode调试wails项目(golang桌面GUI)
vscode·golang
小吴同学(wlx)14 小时前
Golang 进阶3—— 协程&管道
golang
技术卷14 小时前
GO网络编程(三):海量用户通信系统1:登录功能初步
golang·网络编程
虽千万人 吾往矣17 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
__AtYou__1 天前
Golang | Leetcode Golang题解之第448题找到所有数组中消失的数字
leetcode·golang·题解
千年死缓1 天前
go+redis基于tcp实现聊天室
redis·tcp/ip·golang
吃着火锅x唱着歌2 天前
Redis设计与实现 学习笔记 第五章 跳跃表
golang
技术卷2 天前
Redis数据库与GO完结篇:redis操作总结与GO使用redis
数据库·redis·golang
white.tie2 天前
vscode配置golang
ide·vscode·golang
陈序缘2 天前
Go语言实现长连接并发框架 - 任务管理器
linux·服务器·开发语言·后端·golang