• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

大佬们,帮看看这两种生产消费模式有什么不同

第一种:
package main
import (
    "fmt"
    "time"
)
/* 有关Task任务相关定义及操作 */
//定义任务Task类型,每一个任务Task都可以抽象成一个函数
type Task struct {
    f func() error //一个无参的函数类型
}
//通过NewTask来创建一个Task
func NewTask(f func() error) *Task {
    t := Task{
        f: f,
    }
    return &t
}
//执行Task任务的方法
func (t *Task) Execute() {
    t.f() //调用任务所绑定的函数
}


/* 有关协程池的定义及操作 */
//定义池类型
type Pool struct {
    //对外接收Task的入口
    EntryChannel chan *Task
    //协程池最大worker数量,限定Goroutine的个数
    worker_num int
    //协程池内部的任务就绪队列
    JobsChannel chan *Task
}


//创建一个协程池
func NewPool(cap int) *Pool {
    p := Pool{
        EntryChannel: make(chan *Task),
        worker_num:   cap,
        JobsChannel:  make(chan *Task),
    }
    return &p
}


//协程池创建一个worker并且开始工作
func (p *Pool) worker(work_ID int) {
    //worker不断的从JobsChannel内部任务队列中拿任务
    for task := range p.JobsChannel {
        //如果拿到任务,则执行task任务
        task.Execute()
        fmt.Println("worker ID ", work_ID, " 执行完毕任务")
    }
}


//让协程池Pool开始工作
func (p *Pool) Run() {
    //1,首先根据协程池的worker数量限定,开启固定数量的Worker,
    //  每一个Worker用一个Goroutine承载
    for i := 0; i < p.worker_num; i++ {
        go p.worker(i)
    }


    //2, 从EntryChannel协程池入口取外界传递过来的任务
    //   并且将任务送进JobsChannel中
    for task := range p.EntryChannel {

        p.JobsChannel

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

发新帖

发布任务需求已有1031166位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!