Golang中的可见队列

时间:2015-06-12 01:31:52

标签: multithreading go channel

我正在尝试设计一种允许许多进程合作的机制 - goroutines。有两类流程 - 提供者和用户。提供商将其服务的“出价”放入队列,用户等待出价并开始与提供商合作。但是,用户可能不喜欢出价,然后应该发生两件事:

  • 此出价应返回队列。它应该放在队列的开头
  • 应为用户提供队列中的下一个出价

理想情况下,我希望避免协调提供者和用户之间通信的中央流程。 另一种思考这个问题的方法是想象一个“可以窥视”的队列或频道。与AWS Kinesis的工作方式类似的概念。读者可以访问“窥视”队列的头部。由于这位读者正在偷看,没有其他读者可以看到该项目。读者喜欢该项目,然后将其从队列中删除。如果没有,读者会释放项目上的锁定,而另一个读者可以查看。

如何在Go中使用渠道和goroutine最好地实现此行为?

1 个答案:

答案 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,因为我不认为它们是这项工作的正确工具。