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 循环皆可 }