人家都说阅读源码是提高编程水平的极佳方式,但是如何找到适合自己阅读的源码却很痛苦。优秀的开源项目那么多,一定是层出不穷。而如果没有明确的目的,只因着火而望而却步,那就事倍功半了。我更像是一个后台开发程序员,所以下面的观点都是站在一个后台程序员的角度。从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: 为Python提供调用libuv的接口。上面提到的nodejs、tornado、libuv、pyuv、libev、IOCP等概念(项目),大部分都可以找到开源代码,如果你想选择一个适合自己研究的项目,最好的办法就是搞清楚它们关系第一。首先,Tornado和Node.js都可以作为网站的后台服务器应用。而Tornado提供了一个web框架。Tornado的web框架提供了视图和路由功能,我们可以很方便的通过它来编写一个MVC模式的web应用。对于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的源码。如果你想知道,不同的操作系统提供不同的接口,如何在此基础上构建一个跨平台的统一接口,你可以阅读libuv的源码如果你想知道在Linux下如何实现这些I/O接口操作系统,你可以阅读libev的源码如果你想知道如何使用libuv,你也可以在Python下调用跨平台的I/O接口,你可以阅读pyuv的源码。不仅如此,我们还可以从结论中了解更多:如果你想看libuv的源代码,知道libuv是如何实现的,首先得知道如何使用它。只有知道它的作用,才能在看源码的时候有目的。要了解如何使用libuv,请参阅上面分层的一小部分Tornado源代码,或查阅libuv文档。选择源码的一般方法是列出一些感兴趣的关键字,了解关键字的上下层,整理整个关系图,得出结论来做选择。仅仅几步之后,我们就从对Tornado和Node.js的一些认识开始,从模糊的认识中,逐步梳理出从用户的请求到操作系统乃至硬件层面的一条相对清晰的路线。虽然我还没有看过一行源码,但是我已经知道我们通过查看不同的源码可以学到哪些知识。在此基础上,选择适合自己当前需求的源码阅读,可以事半功倍。原文:http://jecvay.com/2015/09/how-to-choose-a-open-source-project-to-read.html作者:Jecvay
