【发布时间】:2019-06-21 22:00:32
【问题描述】:
有什么方法可以判断一个正在运行的函数是否被调用为 goroutine?
我读过 'go tour' 并且对使用 golang 构建 websocket 服务器很感兴趣,所以我找到了这个教程 https://tutorialedge.net/golang/go-websocket-tutorial/
现在我想知道教程中的 wsEndpoint 函数是否作为 goroutine 调用(例如 go wsEndpoint(...))。
我试图阅读 http 包文档,但没有得到清晰的图片,只是猜测处理程序将被 goroutine 调用。这是真的吗?
【问题讨论】:
-
是的,HTTP 处理程序在它们自己的 goroutine 中被调用。请注意,every 函数在 goroutine 中运行,甚至是 main。通常无法确定一个函数是否在与另一个函数不同的 goroutine 中运行。存在一些 hack,但它们依赖于运行时的实现细节,因此不可移植或受兼容性保证的约束。
-
假设我需要从我的函数中访问一些外部数据进行修改,但我不知道该函数是否在另一个 go 例程中被调用。那么如何确定是否需要使用互斥锁来序列化对数据的访问呢?
-
是否需要同步不是运行时的决定。它是在编写代码和编写您已经知道的代码时制作的。
-
这就是问题所在,我想我不知道,因为我不知道我的函数将如何从其他包中调用...
-
这是您的决定;您可以自己解决问题,也可以让用户处理。只需记录您的功能是否可以安全地同时使用。无论这是否常见,您都应该有某种直觉。