Чтобы отказаться от синхронных вызовов, которые выполняются слишком долго, используйте оператор select с time.After:
import "time"
c := make(chan error, 1)
go func() { c <- client.Call("Service.Method", args, &reply) } ()
select {
case err := <-c:
// использование err и reply
case <-time.After(timeoutNanoseconds):
// истечение времени вызова
}
Обратите внимание, что канал c имеет размер буфера 1. Если бы это был небуферизованный канал и метод client.Call занимал больше времени timeoutNanoseconds, передача канала заблокировалась бы навсегда, и горутина никогда не была бы уничтожена.
Читайте также:
Комментариев нет:
Отправить комментарий