【问题标题】:Detect Go routine interruption检测 Go 例程中断
【发布时间】:2019-06-27 14:57:10
【问题描述】:

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

【问题讨论】:

标签: go concurrency interrupt goroutine interrupted-exception


【解决方案1】:

InterruptedException 在 Java 中如果线程被中断就会抛出,例如使用Thread.interrupt() 方法(在等待、睡眠或以其他方式占用时)。

在 Go 中,你不能从外部中断一个 goroutine(参见 cancel a blocking operation in Go),这意味着谈论检测它是没有意义的。

如果在 goroutine 中执行的函数返回,goroutine 可能会正常结束,或者如果它 panic,它可能会突然结束。但即使它发生恐慌,那也是由于它自己的功能,而不是因为另一个 goroutine 强制它或中断它。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      没有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 2020-10-07
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        相关资源
        最近更新 更多