成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何選擇一個適合自己的開源項目來閱讀

開發 項目管理
人們都說, 閱讀源碼是提高編程水平的一個極好的方法, 但是如何找到一個適合自己閱讀的源碼, 就蛋疼的很。 優秀的開源項目非常多, 肯定是看不完的。 而且如果沒有一個明確的目的, 只是因為火就看, 則事倍功半。

人們都說, 閱讀源碼是提高編程水平的一個極好的方法, 但是如何找到一個適合自己閱讀的源碼, 就蛋疼的很。 優秀的開源項目非常多, 肯定是看不完的。 而且如果沒有一個明確的目的, 只是因為火就看, 則事倍功半。

我更像一個后臺開發程序員, 所以以下觀點都基于后臺程序員的視角出發。 

從 Node.js 和 Tornado 出發

在幾個月前, 我學習了 Tornado 框架并用來做了一個項目; 而 Node.js 則是最近幾天才開始學的。 所以很可能會有說的不嚴謹的地方。

Tornado 是一個異步非阻塞服務器應用與輕量級Web框架的結合體。 Node.js 則是一個開源跨平臺的運行環境(runtime environment)。 在我看來, Node.js 基本上就是一個服務器應用了, 因為這一部分和 Tornado 的服務器部分幾乎是一模一樣。

我們的問題主要是應該選擇什么樣的開源代碼來閱讀, 目前為止, 我們可以選擇的項目有Tornado和Node.js了。 先不著急做出決定, 繼續向深處探索一番。 首先化簡問題, 因為 Node.js 的優勢并非僅僅是異步非阻塞提供的高性能, 還有很多其他的東西, 我們暫時不管那些其他的部分。

  • Tornado = AIO Server + Web Framework

  • Node.js = AIO Server

如果學習過操作系統, 就會知道 Linux 下這兩個程序之所以達到如此高性能的效果, 歸功于 Linux 2。6 Kernel 提供的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框架來說, 他直接從服務器應用拿到用戶的 request, 處理完畢后得到一個 response, 直接給回服務器就可以了, 是不需要了解 request 如何傳輸過來以及 response 如何返回給用戶的細節的。

[[148697]]

圖片: web框架與服務器的關系

由于同時會有很多客戶端向服務器發起請求, 服務器要盡快處理這些請求, 提高性能一般是讓cpu在單位時間里面盡量可以處理更多的I/O請求, 方法一般就是采用阻塞的多線程, 或者非阻塞的單線程(當然也可以多線程或者多進程)。

[[148698]]

圖片: 服務器與客戶端的關系

無論是采用哪一種I/O模型, 都要有操作系統的支持, 如果CPU沒有中斷功能, 操作系統就沒有鎖的功能, 也就沒有信號量, 沒有Monitor等一系列同步機制。

對于 Tornado 來說, Python 解釋器提供了上述一系列的同步機制。 因此 Tornado 到底能用什么樣的 I/O 模型, 直接取決于 Python 解釋器。

而 Python 解釋器是運行在操作系統之上, 如果操作系統不提供鎖, 那么解釋器也無法做出一把鎖。 因此 Tornado 到底能用什么樣的 I/O 模型, 間接取決于操作系統。

我想 Node.js 也是一樣的道理。

[[148699]]

圖片: 服務器與操作系統的關系

得出結論

  • 如果想知道一個網站的框架是如何將路由, 視圖(html, css, js之類), 數據處理拼在一起的, 那么可以閱讀 Tornado 源碼中的 Web 框架部分。

  • 如果想知道同時有很多很多的 request 到來, 服務器應用是如何利用操作系統提供的接口來完成高并發處理的, 可以閱讀 Tornado 的服務器部分或者 Node.js的源碼

  • 如果想知道, 不同的操作系統提供了不同的接口, 如何在這個基礎上構建出一個跨平臺的統一接口, 可以閱讀 libuv 的源碼

  • 如果想知道在 Linux 操作系統下, 到底是如何實現這些I/O接口的, 可以閱讀 libev 的源碼

  • 如果想知道如何利用 libuv, 在 Python 下也可以調用跨平臺 I/O 接口, 可以閱讀 pyuv 的源碼

不僅如此, 我們由結論還可以知道更多: 如果想看 libuv 的源碼, 知道 libuv 是如何實現的, 首先得會用它。 只有知道它的作用, 看起源碼來才有一個目的性。 要想知道如何使用 libuv, 得參考其上面一層的 Tornado 源碼中的很小一部分, 或者查閱 libuv 的文檔。

選擇源碼的一般方法

  1. 列出一些感興趣的關鍵字

  2. 對關鍵字的上層和下層進行了解

  3. 梳理出整個關系圖

  4. 得出結論, 做出選擇

經過剛剛幾個步驟, 我們由對 Tornado 和 Node.js 的一些模糊的認識, 逐漸梳理出從用戶發起請求, 到操作系統甚至硬件層面的一條比較清晰的路線。 雖然一行源碼都還沒看, 已經知道了我們看不同的源碼, 分別能學到什么知識。 在這個基礎上, 選擇適合自己當前需求的源碼來閱讀, 就能事半功倍了。

原文:http://jecvay.com/2015/09/how-to-choose-a-open-source-project-to-read.html 作者: Jecvay

責任編輯:王雪燕
相關推薦

2015-09-08 10:32:21

開源項目選擇方式

2017-04-13 19:26:21

2011-11-25 10:18:48

SaaS云計算

2015-07-29 10:00:16

開源項目

2014-10-21 10:25:50

程序員

2009-12-08 11:19:00

2012-08-08 09:30:22

移動OA系統

2021-03-02 14:50:57

開源技術 項目

2021-10-10 12:45:13

編程語言開發

2023-08-17 14:37:55

OmnivorPocket開源

2021-08-23 11:35:37

代碼開發開源

2009-11-18 09:54:25

2011-05-25 09:32:45

數據庫

2015-03-16 09:18:53

2012-12-13 21:50:43

2013-08-19 12:40:18

開源項目

2024-07-02 08:28:17

開源代碼社區

2019-03-10 22:21:47

框架AI開發

2011-09-29 13:32:45

iPhone閱讀

2020-11-14 15:49:40

編程語言C語言Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区免费 | 欧美高清免费 | 国产乱码精品一区二区三区忘忧草 | 亚洲国产精品激情在线观看 | 91精品久久久久 | 国产一二区视频 | 久久久久国产一区二区三区四区 | 欧美日韩三级 | 午夜激情免费视频 | 国产精品视频久久 | 国产精品久久毛片av大全日韩 | 人干人人| 国产精品视频导航 | 国产成人精品免费视频 | 免费的黄色片子 | 欧美极品视频在线观看 | 久久精品亚洲 | 免费观看www7722午夜电影 | 日韩一区二区三区精品 | 玖玖久久 | 97精品国产97久久久久久免费 | 日韩喷潮 | 午夜专区| 超黄视频网站 | 一区在线观看 | 久久国产欧美日韩精品 | 日韩最新网址 | 亚洲第一女人av | 99精品亚洲国产精品久久不卡 | 久久久久久亚洲欧洲 | 亚洲在线一区二区三区 | 精品欧美乱码久久久久久 | 成年视频在线观看 | 国产999精品久久久久久 | 伊人在线 | 欧美自拍另类 | 成人三区| 成人精品一区二区三区中文字幕 | 亚洲精品一区二三区不卡 | 欧美性精品| 91精品久久久 |