如何优化 Go 中的线程安全队列?

How to optimize thread safe queue in Go?

我有以下请求队列:

type RequestQueue struct {
    Requests []*http.Request
    Mutex *sync.Mutex
}

func (rq *RequestQueue) Enqueue(req *http.Request) {
    rq.Mutex.Lock()
    defer rq.Mutex.Unlock()
    rq.Requests = append(rq.Requests, req)
}

func (rq *queue) Dequeue() (*http.Request, error) {
    rq.Mutex.Lock()
    defer rq.Mutex.Unlock()
    if len(rq.Requests) == 0 {
        return nil, errors.New("dequeue: queue is empty")
    }
    req := rq.Requests[0]
    rq.Requests = rq.Requests[1:]
    return req, nil
}

是否可以仅使用 atomic 包而不使用 Mutex 来做到这一点,类型只是 type AtomicRequestQueue []*http.Request,这会带来任何性能优势吗?

使用频道,例如 chan *http.Request。通道 字面意思是 FIFO 队列。

你所说的Enqueue只是一个发送操作c <- req,你所说的Dequeue只是一个接收操作req := <-c

Is it possible to do this with just the atomic package

你没有说明这个线程安全队列的真正目的是什么,但是你上面介绍的用例似乎需要同步,即 mutual ex对共享资源的独占访问。 atomic 包中的类型只保证操作的结果将以一致的方式被其他线程观察到。不存在互斥关系。

如果您的队列需要比您实际显示的更多的业务逻辑,通道可能太原始了;在这种情况下,互斥锁定可能是您最好的选择。如果您希望有大量读取,您可以使用 sync.RWMutex 来减少锁争用。