Обнаружение Го обычного прерывания - PullRequest
0 голосов
/ 03 февраля 2019

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

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

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

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

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

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

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

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

0 голосов
/ 03 февраля 2019

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

Нет.

...