亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大佬們,幫看看這兩種生產消費模式有什么不同

大佬們,幫看看這兩種生產消費模式有什么不同

Go
會飛的wade 2019-06-17 18:45:29
第一種:package mainimport (? ? "fmt"? ? "time")/* 有關Task任務相關定義及操作 *///定義任務Task類型,每一個任務Task都可以抽象成一個函數type Task struct {? ? f func() error //一個無參的函數類型}//通過NewTask來創建一個Taskfunc 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 <- task? ? }? ? //3, 執行完畢需要關閉JobsChannel? ? close(p.JobsChannel)? ? //4, 執行完畢需要關閉EntryChannel? ? close(p.EntryChannel)}//主函數func main() {? ? //創建一個Task? ? t := NewTask(func() error {? ? ? ? fmt.Println(time.Now())? ? ? ? return nil? ? })? ? //創建一個協程池,最大開啟3個協程worker? ? p := NewPool(3)? ? //開一個協程 不斷的向 Pool 輸送打印一條時間的task任務? ? go func() {? ? ? ? for {? ? ? ? ? ? p.EntryChannel <- t? ? ? ? }? ? }()? ? //啟動協程池p? ? p.Run()}第二種:https://blog.51cto.com/11140372/2342953
查看完整描述

目前暫無任何回答

  • 0 回答
  • 0 關注
  • 739 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號