如何优化 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
来减少锁争用。
我有以下请求队列:
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
来减少锁争用。