twisted是一個強大的異步網絡框架,應用的面也非常廣,但是沒有這幾年才出現的Node.js火,社區、文檔也是很少可憐
我覺得二者其實在本質上差不多,而且python使用起來還是比較容易一些的
匿名用戶
因為,它給了一大部分程序猿幻覺比如前后端統一,腳本也能性能很屌,做Demo搜搜快什么的,但實際上,這僅僅是幻覺罷了……
正是因為這樣的幻覺是“看得到”的,又有一個響當當的干爹Google,因此Node的曝光率遠高於后端常規語言就不足為奇了。
論速度,你一個帶JIT的跟常規腳本語言的虛擬機比,沒到數量級差異丟不丟臉?內存各種匪夷所思的占用丟不丟臉?web才和CPython+Gevent一個水平比不過pypy丟不丟臉?
論穩定性,Python十來年的積累,大公司的經驗,你一個以桌面系統為目標的V8拿來做工程逗我玩呢?
論代碼的管理,Js那種匪夷所思的陷阱還要不要一起玩了?Callback hell?
說白了,前端工程師在普通level這級人數太多了,作出來的東西能看得到,吸引力比埋頭在服務器上耕耘的系統工程師要高。技術新人往往是被看得見的先吸引到,但不深入怎么知道系統的嚴謹?node一出前者覺得自己各種碉堡,覺得System Engineer is die 然后四處宣傳,比如你看老子一天擼出個實時web,還帶個碉堡的前端實現,看看你們系統工程師,呵呵呵。Full Stack哦,一個socket連接消耗多少內存都算不出來你跟我談Full Stack?
所以,這就不是浮躁的宣傳這是什么?系統工程是很嚴謹的,打交道的往往不僅僅是代碼,最終產出最看重的也不是什么性能,很多設計很多實現最終服務的都是后端系統的穩定性,擴展性等這些跟錢相關的東西,你跑來跟我談跑循環?循環能賺個錘子?
至於Python的XXX為何不火,Callback早就有Twisted,新生代也有Tornado,Coroutine有Gevent,Actor有Pulsar,VM方面要穩妥CPython,要性能PYPY,要並發Stackless,AIO神馬的的選擇太多了,你喜歡上啥就有啥,社區要運作要宣傳怎么鬧,手頭的牌太多了有木有。Node沒這樣的歷史包袱,就一個選擇,自然全部社區的力量和宣傳都可以集中到這上面去,加之低門檻,你看出書都出了多少,不火才不科學。
但是,做工程和火不火有毛關系啊?
bhuztez,長期求職
關鍵是營銷做得好。說是因為Twisted有什么不如Node.js的技術缺陷,那都是不客觀的。
比如
Node解決這個問題靠的是強制異步IO操作,使得Event driven模型能夠高效執行
這個就太想當然了。連node.js的作者都不會這么說。你一定不知道什么叫POSIX吧。按POSIX的定義,一個file descriptor假如對應的是普通文件,不管有任何non-blocking或者async的選項可以設置,它必須block。Node.js也只是在背后開了一個線程池。這種做法和Twisted並沒有任何區別,而且比Twisted更糟糕。Twisted實現了線程池的功能,並且暴露API給你用,這樣你碰到別的沒法異步的地方,你也可以用Twisted的線程池。而Node.js在很長時間內並不打算提供線程池,或者說,Node.js有線程池只是你不會C++罷了。
另外,沒有搶占式調度,你還是不可避免地要審查代碼。有些代碼相比別的代碼消耗了太多CPU了,成為了瓶頸。查這個比查有沒有調用會block的代碼可難多了。Python再沒節操,好歹庫里也把語言自身的ast暴露出來了,很容易就能寫個腳本檢查出來了,現成Python代碼檢查工具不會比JavaScript難用的,JavaScript語言設計就拖后腿了。
原因之一也許是 JS 能方便地在表達式里插函數,你 python 的 lambda 里能放語句么?
只有要把同步寫法扭曲成異步寫的時候,lambda寫起來是否方便才會顯得很重要。Twisted有inlineCallbacks,不需要扭曲。
python這種語言要做nodejs的異步的事情,得語言支持cps變換才行
原因是V8那時還遠沒有yield。就Node.js用沒有yield的V8而不用早就有yield的SpiderMonkey這點就可以不用看了。這個選擇完全就是為了營銷。Python有yield,沒必要自己搞什么CPS變換。
tornado
是Tornado讓Twisted變得更好了。之前Twisted在Web方面沒有花太大精力,導致Twisted.web也就僅僅是能用,遠說不上是好用。但是Tornado除了Web部分做的比較好,其他地方都是不如 Twisted的。只要把Tornado的Web部分移植到Twisted上,Twisted的Web也不爛了嘛。就有一個叫cyclone的項目做了這個。我不會告訴你跑分還比原生Tornado要好呢。
-----------------------------------------------------
在Node.js還沒起來的時候,Twisted那幾個開發者早就知道只能異步很不好,等知道有Erlang這種語言的時候,都開始大力向推薦大家用Erlang了。Node.js剛出來那時候和Erlang比,不,顯然就不該做這樣的比較。
營銷做得好,才是Node.js火起來的關鍵。
假如你還記得那個多少行寫個IRC的slides。大致是這樣的,Node.js的作者在拿Event-driven和Apache那種fork子進程方式對比的時候,他是有理有據地指出了Event-driven的優點。但是在講和其他模式對比的時候,他講的是感覺。他說要是把那些不能立即返回的操作的調用方式和一般的函數調用區別開,不然會給人以錯覺 。這樣一來,只能寫異步回調就立即變成優點了。把Node.js最致命的缺點都包裝成優點了,再沒節操地鼓動一幫人去搞一些毫無意義的benchmark,立即就避免了不利的局面。喊口號總是最容易的,事件驅動就是高性能, 庫就是包袱,異步回調地獄就是好就是好就是好。就火起來了。
就是這樣
劉縉,系統編程
在Python增加帶返回值的yield前,Twisted代碼全是回調,程序結構那是相當的twisted。在Python這個注重代碼簡明的語言里,Twisted實在是格格不入。大部分Python程序員恐怕沒看完deferred就被嚇跑了。
而回調對js程序員根本不是個事兒。
匿名用戶
首先對於排名第一大談 nodejs 弱爆了,System Engine 才是吊的人做個冷嘲——真正做 nodejs 的如果不熟悉 v8 引擎和 libuv 其實只能是做作外圍吧?而熟悉 v8 和 libuv 的哪一個沒有扎實的 System Engine 基礎(沒個七八年的 C/C++ 項目基礎能玩轉 v8 和 libuv 的那真是少見了)?然后說出什么搞 nodejs 的人搞不清楚 websocket 消耗多少內存這種話你確定打擊面沒有太大?難道你身邊有一些初級的 nodejs 開發人員給你造成了錯覺然后你就優越到沒邊了?
在這種角度就討論技術,討論的根本不是技術,而是自己的偏好,自己的圈子和好惡。調侃下可以,但是真的是一點營養都沒有。而那些贊同他的人,我只想問你們真的有研究過 nodejs?
分割線下面是之前的回答。
-----------------------------------------------
說 nodejs 只是靠營銷的是否太天真了些?當初 nodejs 出來的時候各種 BUG,我簡單的測試其大文件傳輸都會出現各種問題。而同時期的其他陣營早就甩其幾條街了。但是為什么卻能一直不斷發展壯大?難道僅僅靠所謂的營銷和忽悠?
如果只孤立的去考慮 nodejs 的異步庫到底怎樣怎樣,實在是太片面了,難道 nodejs 里面就只提供了異步網絡 IO?
事實上,nodejs 是提供了一套通用的異步基礎設施,使得你可以基於此構建各種異步 API。異步網絡 IO 只是其上的一個具體應用。而現在問題里提及的 twisted 實際上在這一點上根本不具有與 nodejs 的可比性!
我選擇 nodejs 的原因很大程度上是因為它是 JavaScript 的,這樣一來在前后端我可以用同一種語言完成整個項目,這是極大的一個優勢!另外,盡管 nodejs 不是唯一的也不是最早的基於 JavaScript 的服務端方案。但是它是同時期性能 JavaScript 陣營里最佳的。
再加上 nodejs 底層的 libuv 設計很簡單,非常容易擴展,而且 npm 又那么好用。因此開發效率急速上升。
選擇 nodejs 到底為什么,其實到了現在,許多人各自有各自的理由。但許多人都是因為他是基於 JavaScript 的低成本解決方案。