2

我有一个 golang 函数,它递归地遍历 json 字符串,并用它们引用的 json 文档替换自定义引用。我只是注意到我忘了处理循环引用,循环引用的出现会导致无限递归。在我解决这个问题之前,我想为这个案例编写一个测试(使用 ginkgo/gomega),这样我可以验证我的解决方案是否有效,如果我打破它并再次遇到这个问题,我会注意到。

但是我该怎么做if this function call does not return within <timeout>, abort it and fail the test呢?

Gomega'sEventually有一个超时,但如果它已经在运行,它不会中止该函数,因此在这种情况下它将永远阻塞。

我找到了如何使用和通道检查超时的示例select,但据我了解,不可能从外部终止 goroutine - 所以我的函数将继续在后台运行,占用资源?

检查无限递归的最佳方法是什么?

4

1 回答 1

3

您不能中止正在运行的函数。该函数必须支持流产,惯用地通过一个context.Context或一个通道。如果你想支持超时或中止,你必须改变/重构你的函数。并且函数本身必须支持这一点,例如,context.Context如果请求取消,它必须监视并提前返回。有关详细信息和示例,请参阅在取消上下文时终止函数执行

见相关:

在 Go 中取消阻塞操作

取消用户特定的 goroutine

于 2022-01-11T13:15:57.997 回答