Обнаружение Го обычного прерывания
Есть ли способ определить, была ли процедура go прервана во время ее выполнения? Я хотел бы что-то похожее на InterruptedException
на Java: https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html
3 ответа
InterruptedException
в Java выбрасывается, если поток прерывается, например, с Thread.interrupt()
метод (пока он ждет, спит или иным образом занят).
В Go вы не можете прерывать выполнение программы извне (см. " Отмена операции блокировки в Go"), что означает, что нет смысла говорить об ее обнаружении.
Goroutine может нормально завершиться, если функция, которая выполняется в goroutine, возвращается, или может внезапно завершиться, если запаникует. Но даже если он паникует, это происходит из-за его собственной функции, а не потому, что другая программа расправляет его или прерывает.
Программа может быть остановлена только в том случае, если она самостоятельно поддерживает какое-либо завершение, например, она может контролировать канал, который может закрыть другая программа (или отправить на него значение), который при обнаружении программа может вернуть добровольно - что будет считаться нормальным прекращение (а не прерывание).
Есть несколько способов узнать, остановился ли горутин.
- Пройдите канал к горутину. Внутри рутины отложите закрытие канала. За пределами программы вы можете ждать закрытия канала.
- Создать
sync.WaitGroup
и увеличить его на единицу. ПройтиWaitGroup
в рутину. Внутри горутина, отложить вызовDone()
наWaitGroup
, За пределами программы вы можете позвонитьWait()
наWaitGroup
знать, когда это закончится.
Есть ли способ определить, была ли процедура go прервана во время ее выполнения?
Нет.