2010-05-29 25 views
26

我不明白這些框架解決了什麼問題。他們是否替代了像Apache HTTPD,Tomcat,Mongrel等HTTP服務器?還是他們更多?爲什麼我可以使用它們...一些真實世界的例子?我已經看到了無數的聊天室和廣播服務的例子,但是並沒有看到這與例如設置Java程序打開套接字併爲每個請求分派線程的方式不同。Ruby EventMachine,Python Twisted或JavaScript Node.js的要點/目的是什麼?

我想我明白了非阻塞I/O,但我不明白怎麼比一個多線程的Web服務器有什麼不同。對於Node.js,我認爲它只有一個線程,並且這可能比雜耍多個線程更高效,但這是這些框架和傳統Web服務器之間的唯一區別嗎?

回答

4

每個連接沒有堆棧。每個處理器內核只有一個堆棧。並不是說它一次只能做一件事 - 爲什麼不等到忙於切換任務的事情,而不是隨意地來回擺動?

+0

我買的是等待其他事情佔用了大量的時間,但對於其中的特定頁面有很多處理事情,並採取〜500ms的完成情況。這意味着其開始和結束之間的每個其他請求都需要等待1/2秒才能啓動。我正在考慮一個腳本,它能夠處理大量不能以已編譯的方式檢索的事物,即大量的CPU,很少的I/O。 – CCw 2010-05-29 03:20:25

+3

@CCw:不,它不會,至少有節點。js你爲這個過程設置了一個事件,並在完成後得到回調(簡而言之),而腳本的其餘部分繼續處理異步和服務請求。你所描述的是相反的,'同步'方法。 – stagas 2010-05-29 11:00:06

+1

事實上,每頁執行500毫秒計算的東西需要大量的CPU才能獲得併發性,或者應該將其作爲後臺任務進行切片,並將事件完成。 大多數網絡系統都無法運行許多這樣的事情 - 很多堆棧掛着,線程正在切換,沒有人完成任務。 異步編程迫使人們孤立那些表現不佳的代碼,並將系統作爲一個整體考慮。 – aredridel 2010-07-06 03:22:55

6

基於事實上的事件框架是適合於你有大量的IO和更少的CPU操作的情況,但用於定義大部分網頁的的,因爲他們等待分貝。其他的例子是youtube的聊天或視頻 - 一個堆棧允許同時爲更多的客戶提供服務。基於事件的服務器能夠處理數十或數百個通過連接的客戶端,其中這樣的線程數量會導致計算機死機。當你需要做一些處理時,它們的效率會降低。

19

,如果你想要寫代碼,做網絡你可以使用這些框架之一。

例如,如果你打算寫a massively multiplayer video game「建立一個Java程序...派遣一個線程爲每個請求」可能不是一個選項;雜耍中的許多線程非常複雜,而且表現也很差。更何況「僅產生一堆線程」的事實缺少了一堆Twisted等人的管理工具。人。像twistd一樣,它處理日誌記錄,守護進程,啓動和關閉等。

或者如果你想寫一個build automation systemasynchronously invoke and control subprocesses的能力將是有用的。如果你異步生成一個進程,你可以很容易地殺死這個進程並優雅地處理它的退出。如果你通過在該線程中啓動一個線程並阻塞來產生它,則不能輕易停止它,因爲stopping a thread is inherently unsafe

EventMachine的扭都可以用來編寫客戶端程序爲好;也許你正在編寫一個不基於Web的GUI應用程序,並且你希望在客戶端和服務器上使用相同的協議實現。

由於您可以在許多不同的上下文中使用異步框架,因此您可能希望在Web應用程序中使用異步框架,原因很簡單,因爲您有現成的庫代碼,它是爲使用異步框架編寫的其他應用程序編寫的,使用。或者您可能希望能夠在一些假設的未來非Web應用程序中重新使用您的Web應用程序代碼。在這種情況下,它與使用Apache或Tomcat或其他功能方面沒有多大區別,它只是爲您提供更一般的可重用的方式來組織您的程序。