检测Go例行中断

时间:2019-02-03 19:07:35

标签: go concurrency runtime-error interrupt interrupted-exception

有没有一种方法可以检测go例程在执行时是否被中断?我想要类似于Java中的InterruptedExceptionhttps://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html

3 个答案:

答案 0 :(得分:3)

如果线程中断(例如,线程中断),则抛出Java中的

InterruptedException。使用Thread.interrupt()方法(正在等待,睡眠或以其他方式占用)。

在Go语言中,您无法从外部中断goroutine(请参阅cancel a blocking operation in Go),这意味着谈论检测它毫无意义。

如果goroutine中执行的函数返回,则goroutine可能正常结束,或者如果出现恐慌,它可能会突然结束。但是,即使它感到恐慌,也要归因于其自身的功能,而不是因为另一个goroutine强制或中断了它。

goroutine仅在自身支持某种终止(例如,终止)时才能停止。它可能会监视另一个goroutine可能关闭(或在其上发送值)的通道,该通道在检测到时可能会自动返回-这将视为正常终止(而不是中断)。

答案 1 :(得分:2)

有几种方法可以判断goroutine是否已停止。

  1. 将频道传递到goroutine。在goroutine中,推迟关闭通道。在goroutine之外,您可以等待频道关闭。
  2. 创建一个sync.WaitGroup并将其递增1。将WaitGroup传递到goroutine。在goroutine内,延迟在Done()上调用WaitGroup。在goroutine之外,您可以在Wait()上调用WaitGroup来知道何时完成。

答案 2 :(得分:1)

  

有没有办法检测go例程在执行时是否被中断?

否。