Node.js Golang-库是否需要非阻塞?

Node.js Golang-库是否需要非阻塞?,node.js,go,tornado,eventmachine,Node.js,Go,Tornado,Eventmachine,我的理解是,如果非阻塞web服务器(node.js、eventmachine、tornado)调用阻塞库,它们可能会停止运行。戈朗也是这样吗?如果一个goroutine被阻塞,那么另一个goroutine是否会自动获得对CPU的访问权限,或者他们是否必须等待阻塞的goroutine“屈服”?如果是前者,那么库不需要是非阻塞的,是吗?我这样问是因为我没有看到任何Redis/Mongo库明确声明它们是非阻塞的 我的理解是,非阻塞web服务器(node.js, 事件机器(龙卷风)可以在他们打电话给 阻

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

我的理解是,非阻塞web服务器(node.js, 事件机器(龙卷风)可以在他们打电话给 阻塞库。戈朗也是这样吗

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

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

是的,它是在任何类型的IO或通道通信上产生的

或者他们必须等待阻塞的goroutine“屈服”

不,他们没有

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


没有库(或一般的Go代码)不需要是非阻塞的,这使它们更易于编写和维护。在我看来,这是围棋的一大亮点。运行时会运行1000个go例程,您只需编写简单的命令式代码。

因此,如果一个goroutine被阻塞,它不会阻塞整个线程(它与其他goroutine共享)?如果是这种情况,那么您需要编写回调代码的唯一时间就是希望特定的goroutine继续,而不是切换到另一个goroutine(我猜这是非常罕见的)?您不会为此使用回调。你将把“阻塞的东西”放在一个单独的goroutine中,然后在完成后使用频道进行“回话”。@Nick你的三重负片很难理解,请澄清。(“没有图书馆……”)回答得好,尼克。当前异步I/O的流行已经超越了各种运行时的有限功能,特别是JVM。Go突破了特定的限制,使开发人员的生活更加轻松。(奥卡姆也有类似的意图)@Tom,我想他是想在No之后加一个逗号,也就是说,不,库不需要是非阻塞的。库可能被阻塞,因为即使一个goroutine阻塞,其他goroutine仍然可以访问CPU。这与节点、事件机、tornado等形成鲜明对比,因为只有一个线程可以访问CPU,因此永远不会阻塞。