2

我的理解是,如果非阻塞 Web 服务器(node.js、eventmachine、tornado)调用阻塞库,它们可能会停止运行。Golang 也是这样吗?如果一个 goroutine 被阻塞,另一个 goroutine 会自动获得 CPU 访问权限,还是他们必须等待阻塞的 goroutine 'yield'?如果是前者,那么库不需要是非阻塞的,不是吗?我问是因为我没有看到任何明确声明它们是非阻塞的 Redis/Mongo 库。

4

1 回答 1

7

我的理解是,如果非阻塞 Web 服务器(node.js、eventmachine、tornado)调用阻塞库,它们可能会停止运行。Golang 也是这样吗?

不,不是。Go 例程将在 IO 上产生,或者运行时将根据需要创建新的 OS 线程。

如果一个 goroutine 被阻塞,是否会自动授予另一个 goroutine 访问 CPU 的权限

是的,go 例程会产生任何类型的 IO 或通道通信。

还是他们必须等待被阻塞的 goroutine 'yield'?

不,他们没有。

如果是前者,那么库不需要是非阻塞的,不是吗?我问是因为我没有看到任何明确声明它们是非阻塞的 Redis/Mongo 库。

没有库(或一般的 Go 代码)不需要是非阻塞的,这使得它们更容易编写和维护。在我看来,这是 Go 的一个主要优点。运行时会巧妙地运行 1000 多个 go 例程,而您只需编写简单的命令式代码。

于 2013-07-24T23:34:18.077 回答