2013-03-15 22 views
2

最近,我開始在erlang & Yaws的REST API上工作。 我不明白我的模塊如何處理多個請求。如何處理多個請求(A)在雅司?

我有API模塊收集所有請求:

appmods = </, api> 

和我的測試模塊:

-module(api). 
out(_Arg) -> 
    io:format("my pid ~p ~n", [self()]), 
    loop(200000000), 
    [{status, 200}, {header, {"Vary", "Accept"}}, 
    {content, "application/json", ""}]. 

在這一點上,我的理解是,雅司病滋生我的API模塊只有一個實例,向那裏發送所有請求。因此,在任何給定時間只能處理一個請求。

有沒有辦法產生更多的API模塊的進程和傳播請求之間?

或者我應該爲每種類型的API請求做更多的appmods嗎?

或者我理解雅培如何工作是根本錯誤的?

感謝您的幫助。

+0

你爲什麼認爲Yaws不會爲每個連接產生進程?如果您提出兩個併發請求,您在控制檯中看到了什麼? – 2013-03-15 12:14:58

+0

http://i.imgur.com/v03bhkG.jpg – Ginaf 2013-03-15 14:15:01

+0

這可能是底層進程池 – user425720 2013-03-15 22:19:37

回答

1

內部Yaws保持一個接受器進程池。請求在這些進程上處理。 Yaws不會爲每個appmod生成一個新進程,並將給定appmod的所有請求引導至其進程。相反,接受者處理新連接,讀取該連接上的請求並分派它們,併發送響應。一旦連接關閉,由於HTTP 1.0請求(默認情況下需要在每個請求/響應之後關閉連接),由於客戶端關閉它,由於存在「Connection:close」HTTP標頭,或者由於客戶端不活動導致服務器關閉它,接受程序返回到池。

在上面的註釋中鏈接的輸出的JPEG圖像顯示處理所有請求的pid相同,這可能是由於客戶端持續打開連接並在同一連接上發送每個新請求,從而導致相同的服務器進程處理所有這些要求。如果您嘗試使用類似Apache Bench(也稱爲「ab」)的客戶端,該客戶端默認爲HTTP 1.0,並因此爲每個請求建立新的連接,您將看到處理每個請求的不同進程。如果您使用的是執行尾遞歸循環,如gen_server狀態保存過程實現它們

一個需要注意的對appmods,順便說一句,是,對於appmod所有請求的確會指向相同pid,這是循環過程的pid。換句話說,請求將首先在Yaws接受器進程中進行處理(如前所述),但是一旦appmod調用進程,它就會轉入gen_server進程。這種將請求序列化到單個進程中與Yaws無關,而是與如何實現appmod —有關更多詳細信息,您可能需要閱讀one of my published articles about this。簡而言之,不要以這種方式編寫appmods,除非您的應用程序可以接受這種請求序列化。