golang的tunny的用法示例教程
序
本文主要研究一下tunny
Worker
type Worker interface { // Process will synchronously perform a job and return the result. Process(interface{}) interface{} // BlockUntilReady is called before each job is processed and must block the // calling goroutine until the Worker is ready to process the next job. BlockUntilReady() // Interrupt is called when a job is cancelled. The worker is responsible // for unblocking the Process implementation. Interrupt() // Terminate is called when a Worker is removed from the processing pool // and is responsible for cleaning up any held resources. Terminate() }
Worker接口定義了Process、BlockUntilReady、Interrupt、Terminate方法
closureWorker
type closureWorker struct { processor func(interface{}) interface{} } func (w *closureWorker) Process(payload interface{}) interface{} { return w.processor(payload) } func (w *closureWorker) BlockUntilReady() {} func (w *closureWorker) Interrupt() {} func (w *closureWorker) Terminate() {}
closureWorker定義了processor屬性,它實現(xiàn)了Worker接口的Process、BlockUntilReady、Interrupt、Terminate方法,其中Process方法委托給processor
callbackWorker
type callbackWorker struct{} func (w *callbackWorker) Process(payload interface{}) interface{} { f, ok := payload.(func()) if !ok { return ErrJobNotFunc } f() return nil } func (w *callbackWorker) BlockUntilReady() {} func (w *callbackWorker) Interrupt() {} func (w *callbackWorker) Terminate() {}
callbackWorker定義了processor屬性,它實現(xiàn)了Worker接口的Process、BlockUntilReady、Interrupt、Terminate方法,其中Process方法執(zhí)行的是payload函數(shù)
Pool
type Pool struct { queuedJobs int64 ctor func() Worker workers []*workerWrapper reqChan chan workRequest workerMut sync.Mutex } func New(n int, ctor func() Worker) *Pool { p := &Pool{ ctor: ctor, reqChan: make(chan workRequest), } p.SetSize(n) return p } func NewFunc(n int, f func(interface{}) interface{}) *Pool { return New(n, func() Worker { return &closureWorker{ processor: f, } }) } func NewCallback(n int) *Pool { return New(n, func() Worker { return &callbackWorker{} }) }
Pool定義了queuedJobs、ctor、workers、reqChan、workerMut屬性;New方法根據(jù)n和ctor創(chuàng)建Pool;NewFunc方法根據(jù)n和f來創(chuàng)建closureWorker;NewCallback方法創(chuàng)建callbackWorker
Process
func (p *Pool) Process(payload interface{}) interface{} { atomic.AddInt64(&p.queuedJobs, 1) request, open := <-p.reqChan if !open { panic(ErrPoolNotRunning) } request.jobChan <- payload payload, open = <-request.retChan if !open { panic(ErrWorkerClosed) } atomic.AddInt64(&p.queuedJobs, -1) return payload }
Process方法首先遞增queuedJobs,然后從reqChan讀取request,然后往jobChan寫入payload,之后再等待retChan,最后遞減queuedJobs
SetSize
func (p *Pool) SetSize(n int) { p.workerMut.Lock() defer p.workerMut.Unlock() lWorkers := len(p.workers) if lWorkers == n { return } // Add extra workers if N > len(workers) for i := lWorkers; i < n; i++ { p.workers = append(p.workers, newWorkerWrapper(p.reqChan, p.ctor())) } // Asynchronously stop all workers > N for i := n; i < lWorkers; i++ { p.workers[i].stop() } // Synchronously wait for all workers > N to stop for i := n; i < lWorkers; i++ { p.workers[i].join() } // Remove stopped workers from slice p.workers = p.workers[:n] }
SetSize方法首先通過workerMut加鎖,然后根據(jù)lWorkers創(chuàng)建newWorkerWrapper,之后執(zhí)行worker.stop,再執(zhí)行worker.join(),然后清空workers
Close
func (p *Pool) Close() { p.SetSize(0) close(p.reqChan) }
Close方法執(zhí)行SetSize(0)及close(p.reqChan)
實例
func TestFuncJob(t *testing.T) { pool := NewFunc(10, func(in interface{}) interface{} { intVal := in.(int) return intVal * 2 }) defer pool.Close() for i := 0; i < 10; i++ { ret := pool.Process(10) if exp, act := 20, ret.(int); exp != act { t.Errorf("Wrong result: %v != %v", act, exp) } } }
TestFuncJob通過NewFunc創(chuàng)建pool,
小結(jié)
tunny的Worker接口定義了Process、BlockUntilReady、Interrupt、Terminate方法;NewFunc方法創(chuàng)建的是closureWorker,NewCallback方法創(chuàng)建的是callbackWorker。
doc
以上就是golang的tunny的詳細(xì)內(nèi)容,更多關(guān)于golang tunny的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之import導(dǎo)包和初始化詳解,需要的朋友可以參考下2022-04-04Go語言中常量和變量的定義、使用規(guī)范及常見應(yīng)用場景
每一門語言都會有常量的定義,變量的定義,以及基于這些定義的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于Go語言中常量和變量的定義、使用規(guī)范及常見應(yīng)用場景的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Golang import本地包和導(dǎo)入問題相關(guān)詳解
這篇文章主要介紹了Golang import本地包和導(dǎo)入問題相關(guān)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02