乐趣区

关于golang:使用-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 就能够继续执行。

退出移动版