Golang - 库是否需要非阻塞?

时间:2013-07-24 23:24:03

标签: node.js go tornado eventmachine

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

1 个答案:

答案 0 :(得分:7)

  

我的理解是非阻塞Web服务器(node.js,   eventmachine,tornado)如果打电话给他们,可能会停下来   阻止库。这对Golang也是如此吗?

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

  

如果一个goroutine被阻止,则自动给出另一个goroutine   访问CPU

是的 - 在任何类型的IO或频道通信中,例程都会产生。

  

还是他们必须等待封锁的goroutine'屈服'?

不,他们没有。

  

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

没有库(或一般的Go代码)不需要非阻塞,这使得它们更容易编写和维护。在我看来,这是Go的一个主要优点。运行时运行聪明的位运行1000个转到例程,你只需编写简单的命令式代码。