最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang的tunny的用法示例教程

 更新時間:2023年07月14日 13:59:58   作者:codecraft  
這篇文章主要為大家介紹了golang的tunny的用法示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下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語言實現(xiàn)新春祝福二維碼的生成

    Go語言實現(xiàn)新春祝福二維碼的生成

    二維碼現(xiàn)在是隨處度可以看到,買東西,支付,添加好友只要你掃一掃就能完成整個工作,簡單且方便。所以利用這個新春佳節(jié)做一個帶著新春祝福的二維碼吧
    2023-02-02
  • 深入理解go unsafe用法及注意事項

    深入理解go unsafe用法及注意事項

    go雖然是一種高級語言,但是也還是給開發(fā)者提供了指針的類型unsafe.Pointer,我們可以通過它來直接讀寫變量的內(nèi)存,本文來了解一下?unsafe?里所能提供的關(guān)于指針的一些功能,以及使用unsafe.Pointer的一些注意事項
    2024-01-01
  • golang調(diào)用c實現(xiàn)的dll接口細(xì)節(jié)分享

    golang調(diào)用c實現(xiàn)的dll接口細(xì)節(jié)分享

    這篇文章主要介紹了golang調(diào)用c實現(xiàn)的dll接口細(xì)節(jié)分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 詳解go基于viper實現(xiàn)配置文件熱更新及其源碼分析

    詳解go基于viper實現(xiàn)配置文件熱更新及其源碼分析

    這篇文章主要介紹了詳解go基于viper實現(xiàn)配置文件熱更新及其源碼分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • GO語言實現(xiàn)批量壓縮圖片和水印

    GO語言實現(xiàn)批量壓縮圖片和水印

    這篇文章主要介紹了GO語言實現(xiàn)批量壓縮圖片和水印,主要用到了github.com/nfnt/resize這個第三方庫,僅僅支持JPG圖片格式,有相同需求的小伙伴參考下吧。
    2015-03-03
  • Golang實現(xiàn)拓?fù)渑判?DFS算法版)

    Golang實現(xiàn)拓?fù)渑判?DFS算法版)

    這篇文章主要介紹了Golang實現(xiàn)拓?fù)渑判?DFS算法版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫

    詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫

    mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫的相關(guān)使用,希望對大家有所幫助
    2023-09-09
  • Go語言中常見的坑以及高性能編程技巧分享

    Go語言中常見的坑以及高性能編程技巧分享

    代碼的穩(wěn)健性、高性能、可讀性是我們每一位coder必須去追求的目標(biāo),本文結(jié)合Go語言的特性做了相關(guān)總結(jié),感興趣的小伙伴可以了解一下
    2023-06-06
  • Golang中時間相關(guān)操作合集

    Golang中時間相關(guān)操作合集

    這篇文章主要為大家介紹了Golang中的各種時間相關(guān)操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評論

仙游县| 新巴尔虎左旗| 阜平县| 敦煌市| 丽水市| 库车县| 潞西市| 库伦旗| 永宁县| 大冶市| 天长市| 崇仁县| 灌云县| 康马县| 浙江省| 郁南县| 长宁区| 深水埗区| 江门市| 开鲁县| 乡宁县| 乌审旗| 泸定县| 新兴县| 怀来县| 綦江县| 漳浦县| 德惠市| 汕尾市| 轮台县| 巫溪县| 南投县| 会宁县| 高青县| 正宁县| 邹平县| 阿合奇县| 左权县| 宽城| 陈巴尔虎旗| 忻城县|