我為什麽從Node.js回到Python?
壹、NodeJS的特點我們先來看看NodeJS官網的介紹:node . jsisaplatformbuildonchrome ' sjavascriptruntimeforeasilybuildingfast,scalablenetworkapplications . node . jsusesanevent-driven,無阻塞I/omodelthatchmakesitlightweightandefferent,非常適合運行跨分布式設備的數據密集型實時應用。它的特點是:1。它是壹個Javascript運行環境。2.它依靠ChromeV8引擎進行代碼解釋。3.事件驅動。4.非阻塞輸入/輸出5。輕量級,可擴展,適合實時數據交互應用6。單進程,單線程2。NodeJS帶來的系統瓶頸解決方案,確實可以為我們提供解決現實中系統瓶頸的新思路和解決方案。看看它能解決什麽問題。1.並發連接比如,想象壹下我們在銀行排隊的場景。我們來看下面這兩款。(1)系統線程模型:這個模型的問題很明顯。服務器上只有壹個線程,到達時只能處理壹個並發請求(用戶)。剩下的要先等,這就是堵。正在享受服務的請求阻塞了以下請求。(2)多線程和線程池模型:這個模型相對於上壹個有所改進,它調整了服務器上的線程數量,以提高對並發請求的接收和響應,但當並發量較高時,請求仍然需要等待,這就有了壹個更嚴重的問題。從代碼層面來看壹下客戶端請求與服務器通信的過程:服務器與客戶端之間每建立壹個連接,都要為這個連接分配壹組支持資源,主要體現在系統內存資源上。以PHP為例,維持壹個連接可能需要20M內存。這就是當並發性很大時,需要更多服務器的原因。那麽NodeJS是如何解決這個問題的呢?讓我們看另壹個模型,想象我們在快餐店點餐。(3)在異步和事件驅動模型中,我們也想發起壹個請求,等待服務器的響應;但與銀行例子不同的是,這次我們是點完餐後取號,取號時往往是在位置上等,而後面的請求會繼續處理。同樣,我們取了壹個號,在壹旁等著,接待員總能搞定。當食物被編號時,編號會被調用,我們得到自己的食物進行後續加工(食用)。這種調用數字的動作在NodeJS中被稱為Callback,它可以在事件(cooking,I/O)處理完畢後繼續執行下面的邏輯(吃飯),體現了NodeJS的顯著特點。異步機制和事件驅動的流程不會阻塞新用戶(點餐)的連接,也不需要維護已經點餐的用戶和廚師之間的連接。基於這種機制,理論上,用戶相繼請求連接,NodeJS可以響應。所以NodeJS可以支持比Java和PHP程序更高的並發性,雖然維護事件隊列要花錢。而且由於NodeJS是單線程,事件隊列越長,得到響應的時間越長,並發還是會不足。總結壹下NodeJS如何解決並發連接的問題:改變連接服務器的方式,每個連接發出壹個運行在NodeJS引擎進程中的事件並放入事件隊列,而不是為每個連接生成壹個新的OS線程(並為其分配壹些支持內存)。2.I/O阻塞NodeJS解決的另壹個問題是I/O阻塞。看看這樣壹個業務場景:需要從多個數據源提取數據,然後進行處理。(1)串行數據采集是我們的通用解決方案。以PHP為例。如果分別采集profile和timeline需要1,那麽采集串行數據需要2S。(2)NodeJS非阻塞I/O,發射/監聽事件來控制執行過程。NodeJS遇到I/O事件會創建壹個線程執行,然後主線程繼續執行。因此,獲取profile的操作將觸發壹個I/O事件,而獲取timeline的操作將立即執行。如果每個動作需要1,那麽總時間就是65438。它們的I/O操作完成後,發出壹個事件、profile和timeline,事件代理收到後繼續執行下面的邏輯,這就是NodeJS非阻塞I/O的特點,總結壹下:Java和PHP也有實現並行請求(子線程)的方法,但是NodeJS會通過回調函數和異步機制自然地去做。3.NodeJS的優缺點優點:1。高並發(最重要的優勢)2。適合I/O密集型應用缺點:1。不適合CPU密集型應用;CPU密集型應用給Node帶來的挑戰主要有:由於JavaScript單線程,如果有長時間運行的計算(比如大循環),CPU時間片不會釋放,後續I/O不會發起;解決方案:將壹個大的操作任務分解成幾個小的任務,使操作能夠及時釋放,而不會阻塞I/O調用的發起;2.只支持單核CPU,無法充分利用CPU。3.可靠性低。壹旦代碼的某個環節崩潰,整個系統就崩潰了。原因:單進程,單線程解決方案:(1)Nnigx反向代理,負載均衡,開放多個進程,綁定多個端口;(2)啟動多個進程監聽同壹個端口,使用集群模塊;4.開源組件庫質量參差不齊,更新快,向下不兼容。5.調試不方便,錯誤中也沒有stacktrace。4.NodeJS適合的場景是1.RESTfulAPI,這是NodeJS最理想的應用場景,可以處理上萬個連接,本身沒有太多邏輯。只需請求API並組織數據返回即可。它本質上只是從數據庫中查找壹些值,並將它們組合成壹個響應。因為響應是少量文本,入站請求也是少量文本,所以流量不高,甚至壹臺機器就能處理最忙公司的API需求。2.統壹Web應用的UI層目前MVC架構,從某種意義上來說,Web開發有兩個UI層,壹個是我們最終在瀏覽器看到的,壹個是在服務器端,負責生成和拼接頁面。我不討論這種架構是好是壞,但是還有壹種做法,面向服務的架構,它更好的分離了前端和後端的依賴關系。如果所有的關鍵業務邏輯都封裝成REST調用,就意味著上層只需要考慮如何用這些REST接口構建具體的應用。那些後端程序員不關心具體數據是如何從壹個頁面傳遞到另壹個頁面的,也不關心用戶數據更新是通過Ajax還是通過刷新頁面異步獲得的。3.大量Ajax請求的應用,比如個性化應用,每個用戶看到的頁面不壹樣,緩存無效。Ajax請求需要在頁面加載時發起,NodeJS可以響應大量並發請求。總之,NodeJS適用於高並發、I/O密度、業務邏輯少的場景。Python的優點和缺點很簡單——Python是壹種代表簡單思想的語言。讀好的Python程序就像讀英語壹樣,雖然英語要求很嚴格!Python的這種偽代碼性質是它最大的優勢之壹。它能讓妳專註於解決問題,而不是理解語言本身。易學——正如您將看到的,Python非常容易使用。如前所述,Python的語法非常簡單。免費開源——Python是FLOSS(免費/開源軟件)的壹種。簡單地說,妳可以自由地分發這個軟件的副本,閱讀它的源代碼,對它進行修改,並在新的自由軟件中使用它的壹部分。FLOSS基於壹個群體共享知識的概念。這也是Python如此優秀的原因之壹——它是由壹群希望看到更好的Python並不斷改進它的人創造出來的。高級語言——當妳用Python語言編寫程序時,妳不需要考慮諸如如何管理妳的程序所使用的內存這樣的低級細節。可移植性——由於其開源的特性,Python已經被移植到許多平臺上(它已經被修改為可以在不同的平臺上工作)。如果您小心地避免使用依賴於系統的特性,那麽您的所有Python程序都可以在以下任何平臺上運行,而無需修改。這些平臺包括linux,Windows,FreeBSD,Macintosh,Solaris,OS/2,Amiga,AROS,AS/400,BeOS,OS/390,z/OS,PalmOS,QNX,VMS,Psion,AcomRISCOS,VxWorks,PlayStation,SharpZaurus,WindowsCE甚至還有PocketPC,Symbian和Google的基於Linux的Android平臺!解釋性-這壹點需要壹些解釋。用C或C++等編譯語言編寫的程序,可以從源文件(即C或C++語言)轉換成妳的計算機使用的語言(二進制代碼,即0和1)。這個過程是由編譯器和不同的標簽和選項來完成的。當妳運行妳的程序時,鏈接器軟件將妳的程序從硬盤復制到內存並運行它。用Python語言寫的程序不需要編譯成二進制代碼。妳可以直接從源代碼運行程序。在計算機內部,Python解釋器將源代碼轉換成稱為字節碼的中間形式,然後翻譯成計算機使用的機器語言並運行。其實是因為妳不再需要擔心如何編譯程序,如何保證連接轉載正確的庫等等。,這壹切都讓使用Python變得更加容易。因為妳只需要把妳的Python程序復制到另壹臺電腦上就可以了,這也讓妳的Python程序更容易移植。面向對象——Python支持面向過程的編程和面向對象的編程。在“面向過程”的語言中,程序是由壹個過程或者僅僅是壹個可重用代碼的函數構建的。在“面向對象”語言中,程序是由數據和函數組成的對象構建的。與C++和Java等其他主流語言相比,Python以壹種非常強大和簡單的方式實現了面向對象編程。可擴展性——如果妳需要壹段關鍵代碼運行得更快,或者希望某些算法保密,妳可以用C或C++編寫壹些程序,然後在妳的Python程序中使用它們。可嵌入性——您可以將Python嵌入到您的C/C++程序中,從而為您的程序用戶提供腳本功能。豐富的庫——Python標準庫真的很龐大。它可以幫助妳處理各種工作,包括正則表達式、文檔生成、單元測試、線程、數據庫、web瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界面)、Tk等系統相關的操作。記住,只要安裝了Python,所有這些特性都是可用的。這被稱為Python的“全功能”概念。除了標準庫,還有很多其他高質量的庫,比如wxPython、Twisted和Python圖像庫等。總結——Python確實是壹門奇妙而強大的語言。它合理地結合了高性能和使編程簡單有趣的特點。標準代碼——Python使用強制縮進來使代碼具有極強的可讀性。缺點強制縮進也許不能稱之為限制,但是它用縮進來區分句子關系的方式還是給很多初學者帶來了困惑。即使是經驗豐富的Python程序員也可能落入陷阱。最常見的情況是tab和空格混用會導致錯誤,肉眼無法分辨。單行語句和命令行輸出問題經常不能把程序連成壹行,比如importsysforiinsys.path:printi .而Perl和awk則沒有這個限制,可以在shell下輕松完成簡單的程序,不用像Python壹樣把程序寫成. py文件。(對於很多用戶來說,這並不是壹個限制。)65438號+0運行速度,如果有速度要求,用C++重寫關鍵部分。2號國內市場小(國內主要開發python,目前只有壹些web2.0公司)。但是隨著時間的推移,國內很多軟件公司,尤其是遊戲公司,已經開始大規模使用了。No.3中文資料稀缺(好的python中文資料屈指可數)。感謝社區,翻譯了幾本優秀的教材,但是入門級教材很多,高級內容只能看英文。4號建築的選擇太多了(沒有官方。net架構像C#,而ruby因為歷史短,沒有相對集中的架構開發。RubyonRails框架在開發中小型web程序中所向披靡。不過也從另壹個側面說明python是優秀的,吸引了更多的人才和項目。