Это функция, которую я написал, что добавляет запрос к очереди запросов:Go приложение зависает при тестировании функции, которая содержит замок
func (self *RequestQueue) addRequest(request *Request) {
self.requestLock.Lock()
self.queue[request.NormalizedUrl()] = request.ResponseChannel
self.requestLock.Unlock()
}
и это одна из его испытаний:
func TestAddRequest(t *testing.T) {
before := len(rq.queue)
r := SampleRequests(1)[0]
rq.addRequest(&r)
if (len(rq.queue) - 1) != before {
t.Errorf("Failed to add request to queue")
}
}
Когда я запускаю этот тест, приложение зависает. Если я прокомментирую этот тест, все будет хорошо. Я думаю, что проблема заключается в блокировке внутри функции. Есть ли что-то, что я делаю неправильно? Спасибо за помощь!
Одна возможность: может произойти, если какой-либо предыдущий тест 'panic's или возвращает ошибку (или успех), удерживая' requestLock'. Стандартной задачей является 'defer self.requestLock.Unlock()' сразу после каждого 'Lock()', поэтому материал очищается для вас. – twotwotwo
Прежде всего, как @twotwotwo упомянул, откройте его с 'defer'. Во-вторых, вы получаете доступ к rq.queue в своем тесте без блокировки, но если ничего не работает, это может быть хорошо. в-третьих, вы не показываете достаточно остальной части кода, чтобы помочь вам отладить это. –
Я нашел проблему в другой части кода, который, извините, я не предоставил, но очень благодарен за этот совет Defer. Я не думал об этом :) –