我正在尝试设计一种允许许多进程合作的机制 - goroutines。有两类流程 - 提供者和用户。提供商将其服务的“出价”放入队列,用户等待出价并开始与提供商合作。但是,用户可能不喜欢出价,然后应该发生两件事:
理想情况下,我希望避免协调提供者和用户之间通信的中央流程。 另一种思考这个问题的方法是想象一个“可以窥视”的队列或频道。与AWS Kinesis的工作方式类似的概念。读者可以访问“窥视”队列的头部。由于这位读者正在偷看,没有其他读者可以看到该项目。读者喜欢该项目,然后将其从队列中删除。如果没有,读者会释放项目上的锁定,而另一个读者可以查看。
如何在Go中使用渠道和goroutine最好地实现此行为?
答案 0 :(得分:1)
正如@DaveC在评论中指出的那样,最简单快捷的方法是使用互斥锁。
您可以使用"container/list"包,它为您实现双链表。这可以从两端推送/弹出。
这是一个快速实现,可以完成我认为您要求的内容:
import (
"container/list"
"sync"
)
type Queue struct {
q list.List
l sync.Mutex
}
func (q *Queue) Push(data interface{}) {
q.l.Lock()
q.q.PushBack(data)
q.l.Unlock()
}
func (q *Queue) Pop() interface{} {
q.l.Lock()
data := q.q.Remove(q.q.Front())
q.l.Unlock()
return data
}
func (q *Queue) TakeAnother(data interface{}) interface{} {
q.l.Lock()
e := q.q.Front()
// swap the data with whatever is in the front of the list
e.Value, data = data, e.Value
q.l.Unlock()
return data
}
我没有使用频道或goroutines,因为我不认为它们是这项工作的正确工具。