去重复队列结构的工作池

时间:2016-08-07 18:15:20

标签: multithreading go concurrency queue worker

我正在尝试使用循环队列创建工作池。我的代码是Go的惯用语吗?如何解决*Item的并发访问?池处理1个项目,*Item不在工作者之间共享,但有时我需要从主线程更改*Item。我应该在每个*Item放置互斥锁,何时应该锁定/解锁它?或者可能还有其他一些结构?

var items = make(map[uint8]*Item)

func worker(queue, done chan uint8) {
    for id := range queue {
        item := items[id]

        // get from http request
        n := ...

        if item.Count > n {
            ... // perform some actions with id
        }

        done<- id
    }
}

func dispatcher() {
    queue := make(chan uint8, 100)
    done := make(chan uint8, 100)

    for i := 0; i < 4; i++ {
        go worker(queue, done)
    }

    for id := range jobs {
        queue<- id
    }

    for {
        select {
            case id := <-done:
                queue<- id
            ...
        }
    }
}

主要:

func main() {
    go dispatcher()

    for {
        var id, count uint8
        fmt.Scan(&id, &count)
        // modifying
        items[id].Count = count
    }
}

P.S。抱歉我的英语不好。

0 个答案:

没有答案
相关问题