В предыдущей инструкции мы рассмотрели концепт выполнения кода с определенной задержкой. Такой же концепт можно использовать для имплементации таймаута для операций, что запускаются на долгое время. В данной инструкции показано, как это можно сделать.
Как поставить лимит на время выполнения программы в Golang?
1. Создайте файл timeout.go
со следующим содержимым:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package main import ( "fmt" "time" ) func main() { to := time.After(3 * time.Second) list := make([]string, 0) done := make(chan bool, 1) fmt.Println("Начало вставки элементов") go func() { defer fmt.Println("Выход из горутины") for { select { case <-to: fmt.Println("Время истекло") done <- true return default: list = append(list, time.Now().String()) } } }() <-done fmt.Printf("Получилось вставить %d элементов\n", len(list)) } |
2. Запустите код через go run timeout.go
в терминале;
3. Посмотрите на результат:
1 2 3 4 |
Начало вставки элементов Время истекло Выход из горутины Получилось вставить 921886 элементов |
Таймаут для долгих операций в коде выше имплементирован через использование функции time.After
, что предоставляет повторяющийся канал за определенный промежуток времени.
Сама по себе операция использует оператор, что выбирает между каналом time.After
и опцией по умолчанию, что выполняет операцию.
Обратите внимание, что вам нужно позволить коду периодически читать из канала
time.After
для выяснения превышен таймаут или нет. В противном случае, если ветвь кода по умолчанию будет полностью блокировать выполнение, то не будет способа выяснить, истек ли таймаут и завершить операцию.
В примере мы используем функцию time.After
, но функция Timer
также может использоваться подобным способом. Встроенные библиотеки также используют context.WithTimeout
для имплементации функциональности таймаута.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»