code
package main import ( "fmt" "strconv" "time" ) // 生产者消费者模型 // 添加短信发送任务 - 生产者 // 发送短信 - 消费者 // 消息有1w条 - 发送脚本 // 假定发送一个消息需要1s // 这里发送脚本任务数量就是协程数|假设有10个协程那么需要1ks100个协程那么需要100s // 生产者: 添加短信发送任务 func Producer(msg string, msgList chan<- string) { msgList <- msg } // 消费者:发送消息 - 从消息池里面拿出任务发送消息 func Consumer(msgList <-chan string,n string) { for { // 阻塞不让子协程退出-并不断监听消息池 select{ case msg := <- msgList: sendMsg(n+" == "+msg) } } } // 发送消息动作 func sendMsg(msg string){ time.Sleep(time.Second*1) fmt.Println(msg) } func main() { // 消费者 msgList := make(chan string,100) // 创建一个双向channel // 3个协程消费-3个并行 go Consumer(msgList,"A") go Consumer(msgList,"B") go Consumer(msgList,"C") // 创建10w个消息发送任务 c := 10 for i := 0; i < c; i++ { for { if len(msgList) < 100 { Producer(strconv.Itoa(i), msgList) break } } } // 阻塞主协程s select{} }
生产者-消费者
并行3个协程消费短信发送任务