原创文章,转载请注明出处:服务器非业余研究-sunface
阻塞
Go语言中,所有的I/O都是阻塞的,因此我们在写Go系统的时候要秉持一个思想:不要写阻塞的interface和代码,然后通过goroutines和channels来处理并发,而不是用回调和futures。其中一个例子是“net/http"包中的http服务器,无论何时当http服务器接收一个连接,它都会创建一个新的goroutine处理来自这个连接的所有请求,这样我们就能写出很清晰的代码:先做什么,然后做什么。然而,不幸的是,操作系统提供的阻塞式I/O并不适合构建我们自己的阻塞式I/O接口(interface)。
在我之前有关Go运行时的文章中,其中一篇介绍了Go调度器如何处理系统调用。为了处理一个阻塞式的系统调用,我们需要一个操作系统线程,因此如果要在OS的I/O层之上构建我们自己的阻塞式I/O层,则需要为每一个goroutine客户端连接产生一个新的线程,因为这些连接执行系统调用的时候会阻塞。当你拥有10000个客户端线程时构建我们自己的阻塞式I/O层会变得异常昂贵,因为这些客户端都会阻塞在自己的系统调用上等待I/O操作成功。
这里Go通过使用OS提供的异步接口(epoll等)来解决上述这个问题,但是会阻塞那些正在执行I/O的goroutines。
(Go语言)Go的网络轮询及IO机制,布布扣,bubuko.com
原文:http://blog.csdn.net/erlib/article/details/24136841