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

使用golang編寫一個并發(fā)工作隊列

 更新時間:2021年05月08日 10:36:05   作者:u010278923  
這篇文章主要介紹了使用golang編寫一個并發(fā)工作隊列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

其實(shí)golang用一個函數(shù)可以構(gòu)建一個并發(fā)隊列,現(xiàn)在編寫一個靈活可控的隊列程序

先定義一個工作

type Worker struct {
    ID      int
    RepJobs chan int64
    SM      *SM
    quit    chan bool
}

包含了workid和執(zhí)行任務(wù)的id,上面的SM只是任務(wù)具體內(nèi)容,這個和具體業(yè)務(wù)相關(guān),大家自己編寫自己的SM業(yè)務(wù)邏輯

然后定義工作池

type workerPool struct {
    workerChan chan *Worker
    workerList []*Worker
}

這個里面定義了一個工作隊列的切片,可以自定義工作隊列的個數(shù),甚至后期還可以添加work,還定義了一個隊列類型的管道。

定義完成過后就可以初始化工作池了

func InitWorkerPool() error {
    n := 3
    WorkerPool = &workerPool{
        workerChan: make(chan *Worker, n),
        workerList: make([]*Worker, 0, n),
    }
    for i := 0; i < n; i++ {
        worker := NewWorker(i)
        WorkerPool.workerList = append(WorkerPool.workerList, worker)
        worker.Start()
        log.Debugf("worker %d started", worker.ID)
    }
    return nil
}

這個里面我寫死了worker的個數(shù)是3,當(dāng)然這個可以通過讀取配置文件或者參數(shù)傳遞的方式;這個里面逐一啟動work

worker.Start(),這個是關(guān)鍵

func (w *Worker) Start() {
    go func() {
        for {
            WorkerPool.workerChan <- w
            select {
            case jobID := <-w.RepJobs:
                log.Debugf("worker: %d, will handle job: %d", w.ID, jobID)
                w.handleRepJob(jobID)
            case q := <-w.quit:
                if q {
                    log.Debugf("worker: %d, will stop.", w.ID)
                    return
                }
            }
        }
    }()
}

這個就是go 啟動一個協(xié)程,先把自己放到workerChan中,然后不斷從w.RepJobs管道中獲取任務(wù)并執(zhí)行,如果執(zhí)行完成后又把自己放回到隊列中。

所以如果你要有任務(wù)需要執(zhí)行,放到這個管道中即可

func Dispatch() {
    for {
        select {
        case job := <-jobQueue:
            go func(jobID int64) {
                println("Trying to dispatch job: %d", jobID)
                worker := <-WorkerPool.workerChan
                worker.RepJobs <- jobID
            }(job)
        }
    }
}

從管道中拿出一個worker并把任務(wù)id放到worker中去執(zhí)行。

當(dāng)然你可以停止worker,甚至可以停止job

func (w *Worker) Stop() {
    go func() {
        w.quit <- true
    }()
}
func (wp *workerPool) StopJobs(jobs []int64) {
    log.Debugf("Works working on jobs: %v will be stopped", jobs)
    for _, id := range jobs {
        for _, w := range wp.workerList {
            if w.SM.JobID == id {
                log.Debugf("found a worker whose job ID is %d, will try to stop it", id)
                w.SM.Stop(id)
            }
        }
    }
}

補(bǔ)充一下,int64和字符串轉(zhuǎn)換。

string到int

int,err:=strconv.Atoi(string)

string到int64

int64, err := strconv.ParseInt(string, 10, 64)

int到string

string:=strconv.Itoa(int)

int64到string

string:=strconv.FormatInt(int64,10)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語言web框架Gin響應(yīng)客戶端的方式

    Go語言web框架Gin響應(yīng)客戶端的方式

    Gin是一個用Go語言編寫的web框架,它是一個類似于martini但擁有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍,本文給大家介紹了Go語言web框架Gin響應(yīng)客戶端有哪些方式,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • Go語言入門之基礎(chǔ)語法和常用特性解析

    Go語言入門之基礎(chǔ)語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎(chǔ)語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • go 語言字符類型 byte 與 rune案例詳解

    go 語言字符類型 byte 與 rune案例詳解

    這篇文章主要介紹了go 語言字符類型 byte 與 rune案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • golang 字符串比較是否相等的方法示例

    golang 字符串比較是否相等的方法示例

    這篇文章主要介紹了golang 字符串比較是否相等的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 深入理解Golang?make和new的區(qū)別及實(shí)現(xiàn)原理

    深入理解Golang?make和new的區(qū)別及實(shí)現(xiàn)原理

    在Go語言中,有兩個比較雷同的內(nèi)置函數(shù),分別是new和make方法,二者都可以用來分配內(nèi)存,那他們有什么區(qū)別呢?下面我們就從底層來分析一下二者的不同。感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-10-10
  • 基于gin的golang web開發(fā):路由示例詳解

    基于gin的golang web開發(fā):路由示例詳解

    這篇文章主要介紹了基于gin的golang web開發(fā):路由示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    這篇文章主要為大家介紹了Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 解決golang時間字符串轉(zhuǎn)time.Time的坑

    解決golang時間字符串轉(zhuǎn)time.Time的坑

    這篇文章主要介紹了解決golang時間字符串轉(zhuǎn)time.Time的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang簡易實(shí)現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案

    golang簡易實(shí)現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案

    這篇文章主要為大家介紹了golang簡易實(shí)現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 使用go mod導(dǎo)入本地自定義包問題

    使用go mod導(dǎo)入本地自定義包問題

    這篇文章主要介紹了使用go mod導(dǎo)入本地自定義包問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

金塔县| 大宁县| 准格尔旗| 海林市| 张家界市| 克拉玛依市| 镇康县| 麟游县| 宁国市| 稻城县| 自治县| 中宁县| 社会| 浦江县| 凤凰县| 修武县| 邵东县| 双牌县| 大悟县| 邳州市| 周宁县| 利津县| 弋阳县| 桂东县| 明水县| 饶河县| 五河县| 灌云县| 渭南市| 遂川县| 黎平县| 阳谷县| 赞皇县| 盐源县| 喀喇沁旗| 丰镇市| 阆中市| 滕州市| 华亭县| 婺源县| 边坝县|