使用 Goroutine 和 Chanel 快速实现并发和排队


本文摘自网络,作者,侵删。

问题:某线下营业厅有 10 个业务办理窗口,每个窗口同一时刻只能接待一位客人。用 Goroutine 模拟同时有 12 个客户需要办理业务的过程。

思路是这样的:一个 Goroutine 负责将这些任务(也就是例子中的客户)分发到 jobChannel 中,另一个 Goroutine 读取 jobChannel,读到任务后检查是否还有执行器(抽象出来的概念,也就是例子中的业务办理窗口)可以执行该任务,有就创建 Goroutine 进行执行,否则等待,当有可用执行器时继续。

这里“检查是否还有可用执行器”,以及“有执行器后结束等待”是比较有技巧性的地方,我们可以使用带缓冲的 Channel 进行实现,每开始执行一个任务就往该 Channel 写一个值,每个任务执行结束时就读走该 Channel 中的一个值。

runningJobChannel := make(chan int, 10)
for job := range jobChannel {
    runningJobChannel <- 1 // 占位,占不到位时等待

    // 执行器执行任务
    go func() {
        executeJob(job)

        <-runningJobChannel // 释放
    }()
}

runningJobChannel 的缓冲区占满时 runningJobChannel <- 1 会被阻塞,而每个执行器执行完成后的 <-runningJobChannel会对当前占用的缓冲位进行释放,同时 runningJobChannel <- 1 就可以继续执行。


本文来自:Segmentfault

感谢作者:.container .card .information strong

查看原文:使用 Goroutine 和 Chanel 快速实现并发和排队

相关阅读 >>

Golang interface接口深入理解

手撸Golang Go与微服务 saga模式之7

Golang怎么把字符串转成int类型

Golang约瑟夫问题

Golang中的channel通道

聊聊dubbo-Go-proxy的jtypes

最新字节跳动面试题与答案: 无序数组的中位数 (快排思想o(n) 时间复杂度)

Golang和erlang区别

在 docker 下 Golang 的 Gomaxprocs 初始化混乱问题

Golang中关于文件的操作

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...