Завершение дополнительных фоновых горутин сразу после завершения основной main() - Как это работает
Primary tabs
Forums:
Да, после завершения основной горутины из main() другие тоже завершаются превентивно (условно "немедленно").
Демонстрация в коде
Это можно продемонстрировать на примере кода:
package main
import (
"log"
"os"
"time"
)
func main() {
f, err := os.Create("./test.txt")
if err != nil {
log.Fatal("can not write to a file", err)
}
// запускаем горутину
go func() {
// она будет бесконечно писать в файл каждую секунду
for {
f.WriteString("new line created at: " +
time.Now().String() + "\n")
time.Sleep(1 * time.Second)
}
}()
// ждем 5 секунд в главной горутине
time.Sleep(5 * time.Second)
// но на деле выполнение вышезапущенной горутины
// тоже прекратиться через 5 секунд
}
-- здесь для демонстрации прекращения работы фоновой горутины, после завершения работы главной горутины из main() используется запись в файл, который создается в той же папке, в которой лежит запускаемая программа.
То есть после завершения функции main():
- golang не ждет завершения неглавных горутин, после завершения главной, а просто их вырубает
- Важно отметить, что любые операторы отложенного выполнения (типа defer) внутри этих фоновых горутин выполняться не будут.
- Пока горутины завершаются, операционная система всё равно будет освобождать память и ресурсы процесса (например, файловые дескрипторы), но внутренняя логика приложения (например, корректное закрытие соединения с базой данных) будет пропущена.
Источники
- Log in to post comments
- 36 reads