我正在尝试使用循环队列创建工作池。我的代码是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。抱歉我的英语不好。