我正在尝试设计一种允许多个进程协作的机制——goroutines。有两类进程——提供者和用户。 vendor 将他们服务的“出价”放入队列中,用户等待出价并开始与 vendor 合作。但是,用户可能不喜欢出价,然后会发生两件事:
- 此出价应返回队列。它应该放在队列的开头
- 应为用户提供队列中的下一个出价
理想情况下,我希望避免使用中央流程来协调提供商和用户之间的通信。 考虑这个问题的另一种方法是想象一个“可窥视”的队列或 channel 。类似于 AWS Kinesis 工作方式的概念。读者可以获得“窥视”队列头部的权限。由于该读者正在浏览,因此其他读者无法看到该项目。如果读者喜欢该项目,则将其从队列中删除。如果不是,则读者释放对该项目的锁定并且另一个读者可以偷看。
关于如何使用 channel 和 goroutines 在 Go 中最好地实现这种行为有什么想法吗?
最佳答案
正如@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
}
我没有在任何地方使用 channel 或 goroutine,因为我认为它们不是这项工作的正确工具。
关于multithreading - Golang 中的可窥视队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30794018/