#go #deferred #goroutine
#Вперед #отложенный #goroutine
Вопрос:
есть ли в go возможность отложить выполнение процедуры go или способ добиться желаемого поведения? Следующая справочная информация: я объединяю соединения с базой данных в канале. В основном в обработчике, который я вызываю
session, err := getSessionFromQueue()
// ...
// serving content to my client
// ...
go queueSession(session)
Что я действительно хотел бы сделать, так это:
session, err := getSessionFromQueue()
defer go queueSession(session)
// ...
// serving content to my client
// ...
чтобы избежать зависания / сбоя моего обработчика в какой-то момент, и сеанс не будет должным образом возвращен в очередь. Причина, по которой я хочу запустить ее как процедуру go, заключается в том, что queueSession
она потенциально блокируется на 1 секунду (в случае, если очередь заполнена, я жду одну секунду, прежде чем полностью закрыть сеанс).
Обновить
@abhink навел меня на правильный путь. Я решил проблему, введя вызов в queueBackend
подпрограмму.
func queueSession(mongoServer *Server) {
go func(mongoServer *Server) {
select {
case mongoQueue <- mongoServer:
// mongoServer stored in queue, done.
case <- time.After(1 * time.Second):
// cannot queue for whatever reason after 1 second
// abort
mongoServer.Close()
}
}(mongoServer)
}
Теперь я могу просто вызвать
defer queueSession(session)
и он запускается как подпрограмма.
Ответ №1:
Нет способа напрямую defer
запустить подпрограмму. Вы можете попробовать что-то вроде этого:
session, err := getSessionFromQueue()
defer func() {
go queueSession(session)
}()
Комментарии:
1. спасибо, это поставило меня на правильный путь. Я реализовал это немного по-другому, но использование функции anonymos было очень хорошей отправной точкой.