我正在尝试设计一种机制,以允许许多程序和goroutine进行协作。提供者和用户分为两类过程。供应商提出了一个"出价"。将他们的服务排入队列,用户等待竞标,然后开始与提供商合作。但是,用户可能不喜欢出价,然后应该发生两件事:

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

理想情况下,我想避免协调提供者和用户之间通信的中央过程。
思考这个问题的另一种方法是想象一个"可窥视的"。队列或通道。与AWS Kinesis的工作方式相似的概念。读者可以访问" peeka"?进入队列的开头。由于该读者正在偷看,因此没有其他读者可以看到该项目。读者喜欢该项目,然后将其从队列中删除。否则,阅读器将释放该物品的锁,另一个阅读器可以窥视。

有什么想法如何使用渠道和goroutines在Go中最好地实现这种行为?

正如@DaveC在他的评论中指出的那样,最简单,最快的方法是使用互斥锁。

您可以使用"容器/列表"包,该包为您实现了一个双向链接列表。可以从两端推动/弹出。

这是一个快速的实现方式,它可以满足我的要求:

在任何地方都不能使用通道或goroutine,因为我认为它们不是这项工作的正确工具。