Обнаружение Го обычного прерывания

Есть ли способ определить, была ли процедура go прервана во время ее выполнения? Я хотел бы что-то похожее на InterruptedException на Java: https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html

3 ответа

InterruptedException в Java выбрасывается, если поток прерывается, например, с Thread.interrupt() метод (пока он ждет, спит или иным образом занят).

В Go вы не можете прерывать выполнение программы извне (см. " Отмена операции блокировки в Go"), что означает, что нет смысла говорить об ее обнаружении.

Goroutine может нормально завершиться, если функция, которая выполняется в goroutine, возвращается, или может внезапно завершиться, если запаникует. Но даже если он паникует, это происходит из-за его собственной функции, а не потому, что другая программа расправляет его или прерывает.

Программа может быть остановлена ​​только в том случае, если она самостоятельно поддерживает какое-либо завершение, например, она может контролировать канал, который может закрыть другая программа (или отправить на него значение), который при обнаружении программа может вернуть добровольно - что будет считаться нормальным прекращение (а не прерывание).

Есть несколько способов узнать, остановился ли горутин.

  1. Пройдите канал к горутину. Внутри рутины отложите закрытие канала. За пределами программы вы можете ждать закрытия канала.
  2. Создать sync.WaitGroup и увеличить его на единицу. Пройти WaitGroup в рутину. Внутри горутина, отложить вызов Done() на WaitGroup, За пределами программы вы можете позвонить Wait() на WaitGroup знать, когда это закончится.

Есть ли способ определить, была ли процедура go прервана во время ее выполнения?

Нет.

Другие вопросы по тегам