问题:某线下营业厅有 10 个业务办理窗口,每个窗口同一时刻只能接待一位客人。用 Goroutine 模拟同时有 12 个客户需要办理业务的过程。
思路是这样的:一个 Goroutine 负责将这些任务(也就是例子中的客户)分发到 jobChannel 中,另一个 Goroutine 读取 jobChannel,读到任务后检查是否还有执行器(抽象出来的概念,也就是例子中的业务办理窗口)可以执行该任务,有就创建 Goroutine 进行执行,否则等待,当有可用执行器时继续。
这里 “检查是否还有可用执行器”,以及 “有执行器后结束等待” 是比较有技巧性的地方,我们可以使用带缓冲的 Channel 进行实现,每开始执行一个任务就往该 Channel 写一个值,每个任务执行结束时就读走该 Channel 中的一个值。
runningJobChannel := make(chan int, 10)
for job