都说阅读源码是提高编程水平的绝好方法,但是如何找到适合自己阅读的源码却是一个痛点。有太多优秀的开源项目,你无法完成它们。而如果你没有一个明确的目的,只是因着火而看,会事半功倍。我更像是一个后台开发程序员,所以下面的观点都是站在一个后台程序员的角度。几个月前从Node.js和Tornado入手,学习到Tornado框架,并用它做了一个项目;而Node.js这几天才开始学习。所以可能会有一些不严谨的地方。Tornado是一个异步非阻塞服务器应用程序和一个轻量级的Web框架Node.js是一个开源的跨平台运行环境。在我看来,Node.js基本上是一个服务器应用程序,因为这部分与Tornado的服务器部分几乎相同。我们主要的问题是我们应该选择阅读什么样的开源代码。到目前为止,我们可以选择的项目是Tornado和Node.js。不要急于做出决定,继续深入探索。首先把问题简单化,因为Node.js的优势不仅仅在于异步非阻塞所提供的高性能,还有很多其他的东西,其他的部分我们暂且忽略。Tornado=AIOServer+WebFrameworkNode.js=AIOServer如果你学过操作系统,就会知道这两个程序之所以能在Linux下达到这么高的性能,都是得益于Linux2.6Kernel提供的epoll。我的想法是,如果Node.js运行在Linux下,肯定会调用操作系统提供的epoll;如果在Windows下运行,肯定会调用操作系统提供的IOCP。顺着这个思路,找到了libuv和pyuv这两个开源项目。libuv:一般认为libuv是因为nodejs而诞生的。libuv的作用是为用户隐藏了操作系统的差异,封装了Linux的libev和windows的IOCP等,提供了一个跨平台的异步操作库。,pyuv,libev,IOCP这些概念(项目),大部分都可以找到开源代码,如果你想选择一个适合自己学习的项目,最好的办法就是先了解他们的关系。首先,Tornado和node.js都可以作为网站后台服务器应用。而Tornado提供了一个web框架。Tornado的web框架提供了视图和路由功能。使用它,我们可以轻松地以MVC模式编写Web应用程序。对于web框架,他直接从服务端应用获取用户的请求,处理后得到响应,可以直接发回服务端。没有必要了解请求如何传输以及响应如何返回给用户的细节。因为会有很多客户端向服务器发起请求,服务器必须尽快处理这些请求。为了提高性能,CPU可以在单位时间内处理尽可能多的I/O请求。方法一般是使用阻塞多线程或者非阻塞单线程(当然也可以是多线程或者多进程)。无论采用哪种I/O模型,都必须有操作系统的支持。如果CPU没有中断功能,操作系统就没有锁功能,也就没有信号量。没有Monitor之类的同步机制。对于Tornado,Python解释器提供了上述一系列的同步机制。因此,Tornado能使用什么样的I/O模型,直接取决于Python解释器。Python解释器是运行在操作系统上的,如果操作系统不提供锁,那么解释器就无法进行锁操作。因此,Tornado能使用什么样的I/O模型,间接取决于操作系统。我想Node.js也是一样的道理。如果想了解一个网站框架是如何结合路由、视图(html、css、js等)、数据处理的,可以阅读Tornado源码中的Web框架部分。如果你想知道有很多很多的请求同时到来,服务器应用程序是如何使用操作系统提供的接口来完成高并发处理的,你可以阅读Tornado的服务器部分或者Node的源码.js如果想知道,不同的操作系统提供不同的Interface,如何在此基础上构建跨平台的统一接口,可以阅读libuv的源码如果想知道在Linux操作系统下如何实现这些I/O接口,可以阅读libev的源码。如果想了解libuv的使用方法,也可以调用Python下的跨平台I/O接口。你可以阅读pyuv的源代码。不仅如此,我们还可以从结论中了解到更多:要想看libuv的源码,??想知道libuv是如何实现的,首先要知道如何使用。只有知道它的作用,看源码才会有目的。如果想知道如何使用libuv,必须要参考上层一小部分Tornado源码,或者查阅libuv文档。选择源码的一般方法是列出一些感兴趣的关键字,了解关键字的上下层,梳理整个关系图,得出结论进行选择,只需几步,从我们对模糊的理解Tornado和Node.js,从用户的请求到操作系统乃至硬件层面,我们逐渐梳理出一条比较清晰的路线。虽然我们一行源码都没看,但我们已经知道了我们查看不同的源码,看看我们能学到什么知识。在此基础上,选择适合自己当前需求的源码阅读,事半功倍
