第一種: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
提交
取消