main 函数的过程就是首先创建一个监听套接字,然后用一个 for 循环不断的从监听套接字上 Accept 新的连接,最后调用 echoFunc 函数在建立的连接上干活。关键代码是:
每收到一个新的连接,就创建一个“线程”去服务这个连接,因此所有的业务逻辑都可以同步、顺序的编写到echoFunc 函数中,再也不用去关心网络 IO 是否会阻塞的问题。不管业务多复杂,Go 语言的并发服务器的编程模型都是长这个样子。可以肯定的是,在 linux 上 Go 语言写的网络服务器也是采用的 epoll 作为最底层的数据收发驱动,Go 语言网络的底层实现中同样存在“上下文切换”的工作,只是这个切换工作由 runtime 的调度器来做了,减少了程序员的负担。
弄明白网络库的底层实现,貌似只要弄清楚 echo 服务器中的 Listen、Accept、Read、Write 四个函数的底层实现关系就可以了。