zoukankan      html  css  js  c++  java
  • golang简单的消费者生产者模型

    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个协程消费短信发送任务

    I can see a bigger world.
  • 相关阅读:
    sosex !mk
    使用boost iostream写文件
    编译ios版本的ffmpeg0.11.1
    转换日期为中文数字
    sosex !muf查看方法的反汇编代码
    Xcode 4.5.2 + iOS 6.0免证书(iDP)开发+真机调试+生成IPA全攻略
    sosex查看变量的命令!mdt
    vs2012编译openssl
    为ios编译openssl
    打开的页面关闭后刷新主页面
  • 原文地址:https://www.cnblogs.com/xuweiqiang/p/15432977.html
Copyright © 2011-2022 走看看