golang简单的消费者生产者模型

code

package main

import (
    "fmt"
    "strconv"
    "time"
)

// 生产者消费者模型
// 添加短信发送任务 - 生产者
// 发送短信 - 消费者
// 消息有1w条 - 发送脚本
// 假定发送一个消息需要1s
// 这里发送脚本任务数量就是协程数|假设有10个协程那么需要1ks\100个协程那么需要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个协程消费短信发送任务

 

posted @ 2021-10-21 12:59  许伟强  阅读(270)  评论(0编辑  收藏  举报