Возможно ли отложить выполнение подпрограммы?

#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 было очень хорошей отправной точкой.