【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语言学习、求职的社区。

相关推荐
Achou.Wang11 小时前
源码分析 golang bigcache 高性能无 GC 开销的缓存设计实现
开发语言·缓存·golang
Yeats_Liao13 小时前
Go语言技术与应用(二):分布式架构设计解析
开发语言·分布式·golang
蓝婴天使13 小时前
基于 React + Go + PostgreSQL + Redis 的管理系统开发框架
react.js·postgresql·golang
脚踏实地的大梦想家13 小时前
【Go】P6 Golang 基础:流程控制
开发语言·golang
QX_hao13 小时前
【Go】--数组和切片
后端·golang·restful
-睡到自然醒~13 小时前
提升应用性能:Go中的同步与异步处理
开发语言·后端·golang
只吃不吃香菜13 小时前
Go WebSocket 协程泄漏问题分析与解决方案
开发语言·websocket·golang
ChineHe14 小时前
Golang并发编程篇001_并发编程相关概念解释
开发语言·后端·golang
赴前尘16 小时前
Go 通道非阻塞发送:优雅地处理“通道已满”的场景
开发语言·后端·golang
lastHertz17 小时前
Golang 项目中使用 Swagger
开发语言·后端·golang