2013-07-24 53 views
2

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

回答

7

我的理解是,非阻断的Web服务器(node.js的, EventMachine的,龙卷风)可以运转了,如果他们作出一个 堵库的调用。这对于Golang也是如此吗?

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

如果一个够程被封锁,是一个又一个自动获得 访问CPU

是的,它就是 - 去程序上的任何类型的IO或信道通信的产生。

还是他们不得不等待被封锁的goroutine'屈服'?

不,他们没有。

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

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

+0

因此,如果一个goroutine被阻塞,它不会阻塞整个线程(它与其他goroutines共享)?如果是这种情况,那么你唯一需要编写回调代码的时候是当你想要这个特定的goroutine继续,而不是切换到另一个时(我猜测这很罕见)? – tldr

+2

你不使用回调。你会把这个“阻塞的东西”放在一个单独的goroutine中,然后用它来通道,以便在完成时“回话”。 –

+0

@尼克你的三重否定很难理解,请澄清。 (“没有图书馆...”) – thwd