Go任务调度
在搞pulsar的consumer的时候,开启多个消费者怎么调度。调度池怎么处理,这里整理下 先做个简单的 后续补上 timeout pool等其他类型
第一种:通过chan跟主协程通信
package main
import (
"log"
"time"
)
func main() {
//用来接收子任务的状态 子任务如果结束 则会传递信号
chanA := make(chan bool, 1)
chanB := make(chan bool, 1)
//子任务对应的id 后续可以用来记录日志等情况
i, j := 0, 0
go taskA(chanA, i)
go taskB(chanB, j)
for { //主进程
select {
case <-chanA:
i++
log.Printf("taskA 已经结束,开启新的taskA,id=%d \r\n", i)
go taskA(chanA, i)
case <-chanB:
j++
log.Printf("taskB 已经结束,开启新的taskB,id=%d \r\n", j)
go taskB(chanB, j)
default:
log.Printf("Main程序运行中...... \r\n")
time.Sleep(time.Second) //这个时间可以自定义调整 心跳监控时间
}
}
}
func taskA(c chan bool, id int) {
defer func() { c <- true }() // 结束的时候给发信号
log.Printf("TaskA %d exec......\r\n", id)
time.Sleep(3 * time.Second) //业务执行 for 循环皆可
}
func taskB(c chan bool, id int) {
defer func() { c <- true }() // 结束的时候给发信号
log.Printf("TaskB %d exec......\r\n", id)
time.Sleep(6 * time.Second) //业务执行 for 循环皆可
}
