Detect Go例行中断

问题描述 投票:-2回答:3

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

go concurrency interrupt goroutine interrupted-exception
3个回答
3
投票

有几种方法可以确定goroutine是否已停止。

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

3
投票

InterruptedException在Java中,如果线程中断,例如抛出使用InterruptedException方法(正在等待,睡眠或以其他方式占用时)。

在Go中,您无法从外部打断goroutine(请参阅Thread.interrupt(),这意味着毫无意义地谈论检测到它。

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.