我的理解是,如果他们调用阻塞库,非阻塞Web服务器(node.js,eventmachine,tornado)可能会停止运行。这对Golang也是如此吗?如果一个goroutine被阻止,另一个goroutine会被自动访问CPU,还是他们必须等待阻塞的goroutine“屈服”?如果它是前者,那么图书馆不需要非阻塞,是吗?我问,因为我没有看到任何Redis / Mongo库明确声明它们是非阻塞的。
答案 0 :(得分:7)
我的理解是非阻塞Web服务器(node.js, eventmachine,tornado)如果打电话给他们,可能会停下来 阻止库。这对Golang也是如此吗?
不,不是。 Go例程将在IO上生成,或者运行时将根据需要创建新的OS线程。
如果一个goroutine被阻止,则自动给出另一个goroutine 访问CPU
是的 - 在任何类型的IO或频道通信中,例程都会产生。
还是他们必须等待封锁的goroutine'屈服'?
不,他们没有。
如果是前者,那么库不需要是非阻塞的 他们?我问,因为我没有看到任何Redis / Mongo库 明确声明他们是非阻塞的。
没有库(或一般的Go代码)不需要非阻塞,这使得它们更容易编写和维护。在我看来,这是Go的一个主要优点。运行时运行聪明的位运行1000个转到例程,你只需编写简单的命令式代码。