Golang的協程池設計

2021-10-19 02:38:13 字數 1929 閱讀 1167

同一時刻可以處理多個事務

更加節省時間,效率更高

具有並行處理能力的程式我們稱之為「併發程式」

併發程式的處理能力優勢體現在**?

gopool3.jpeg

package main

import "fmt"

import "time"

func go_worker(name string)

fmt.println(name, " 執行完畢!")

}func main()

}

那麼多個goroutine之前如何通訊呢?

package main

import "fmt"

func worker(c chan int)

func main()

為什麼需要協程池?

雖然go語言在排程goroutine已經優化的非常完成,並且goroutine作為輕量級執行流程,也不需要cpu排程器的切換,我們一般在使用的時候,如果想處理乙個分支流程,直接go一下即可。

但是,如果無休止的開闢goroutine依然會出現高頻率的排程groutine,那麼依然會浪費很多上下文切換的資源,導致做無用功。所以設計乙個goroutine池限制goroutine的開闢個數在大型併發場景還是必要的。

)/* 有關task任務相關定義及操作 */

//定義任務task型別,每乙個任務task都可以抽象成乙個函式

type task struct

//通過newtask來建立乙個task

func newtask(f func() error) *task

return &t

}//執行task任務的方法

func (t *task) execute()

/* 有關協程池的定義及操作 */

//定義池型別

type pool struct

//建立乙個協程池

func newpool(cap int) *pool

return &p

}//協程池建立乙個worker並且開始工作

func (p *pool) worker(work_id int)

}//讓協程池pool開始工作

func (p *pool) run()

//2, 從entrychannel協程池入口取外界傳遞過來的任務

// 並且將任務送進jobschannel中

for task := range p.entrychannel

//3, 執行完畢需要關閉jobschannel

close(p.jobschannel)

//4, 執行完畢需要關閉entrychannel

close(p.entrychannel)

}//主函式

func main() )

//建立乙個協程池,最大開啟3個協程worker

p := newpool(3)

//開乙個協程 不斷的向 pool 輸送列印一條時間的task任務

go func()

}()//啟動協程池p

p.run()

}

Golang學習篇 協程池

目錄 1.為什麼需要協程池?2.簡單的協程池 3.go playground pool 4.ants 推薦 雖然go語言自帶 高併發 的標籤,其併發程式設計就是由groutine實現的,因其消耗資源低 大約2kb左右,執行緒通常2m左右 效能高效,開發成本低的特性而被廣泛應用到各種場景,例如服務端開...

Golang協程排程

有時候可能會出現這種情況,乙個無恥的goroutine阻止其他goroutine執行。當你有乙個不讓排程器執行的 for迴圈時,這就會發生。package main import fmt func main for done fmt.println done for迴圈並不需要是空的。只要它包含了不...

golang 協程理解

本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...