golang 并发实践
生活随笔
收集整理的這篇文章主要介紹了
golang 并发实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
golang 高并發主要是依靠sync包下的api實現,首先就是WaitGroup:
先說說WaitGroup的用途:它能夠一直等到所有的goroutine執行完成,并且阻塞主線程的執行,直到所有的goroutine執行完成。
WaitGroup總共有三個方法:Add(delta int),Done(),Wait()。簡單的說一下這三個方法的作用。
Add:添加或者減少等待goroutine的數量
Done:相當于Add(-1)
Wait:執行阻塞,直到所有的WaitGroup數量變成0
代碼:
type Worker struct {quit chan bool }func NewWorker() Worker {return Worker{quit: make(chan bool)} }// Start method starts the run loop for the worker, listening for a quit channel in // case we need to stop it func (w Worker) Start() {go func() {for {select {case <-JobQueue:// we have received a work request.doTask()case <-w.quit:// we have received a signal to stopreturn}}}() }// Stop signals the worker to stop listening for work requests. func (w Worker) Stop() {go func() {w.quit <- true}() }Job類:
type Job struct { }var JobQueue chan Job = make(chan Job, MaxQueue)func doTask() {//耗時炒作(模擬)time.Sleep(200 * time.Millisecond)wg.Done() }//這里模擬的http接口,每次請求抽象為一個job func handle() {//wg.Add(1)job := Job{}JobQueue <- job }var (MaxWorker = 1000MaxQueue = 200000wg sync.WaitGroup )Dispatcher 類:
type Dispatcher struct { }func NewDispatcher() *Dispatcher {return &Dispatcher{} }func (d *Dispatcher) Run() {// starting n number of workersfor i := 0; i < MaxWorker; i++ {worker := NewWorker()worker.Start()} }測試執行代碼:
func Benchmark_handle(b *testing.B) {runtime.GOMAXPROCS(runtime.NumCPU())d := NewDispatcher()d.Run()for i:=0;i<10000;i++ {wg.Add(1)handle()}wg.Wait() }?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的golang 并发实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Vue】 element ui 引入第
- 下一篇: 国产武侠游戏巅峰 等了16年的《仙剑4重