multithreading - Golang 中的可窥视队列

标签 multithreading go channel

我正在尝试设计一种允许多个进程协作的机制——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/

相关文章:

c# - 在循环内创建任务

c# - 看不到无限循环

golang assemble 内存分配

go - 检查 channel 长度在 `for{ len(c) }` 中变得无响应

xml - 在后台线程上将 XML 解析为 CoreData 以不锁定 UI

java - Thread 中的 repaint() 导致 CPU 使用率很高

unit-testing - httptest.NewRequest 与 http.NewRequest : which one to use in tests and why?

go - []interface{}{}中的双花括号是什么意思

go - 使用 goroutine 和闭包从并发函数读取并发错误

tcl - 如何在不使用 TclOO 的情况下插入读取 channel 转换?