- 論壇徽章:
- 1
|
本帖最后由 iakuf 于 2013-10-18 17:34 編輯
回復(fù) 1# py
問題1. morbo和hypnotoad從介紹上看是完全一樣的,難道唯一的區(qū)別就是hypnotoad是Prefork的。。?
morbo 是單進(jìn)程,默認(rèn)用來做測(cè)試用, 你可以一邊修改代碼,他會(huì)自動(dòng) reload 加載你的修改. 只要你的修改的代碼是在 lib templates 目錄下. Dancer 的測(cè)試用 Web 服務(wù)器也是這樣,但是程序本身有大的錯(cuò)會(huì)自動(dòng)退出.但 Morbo 不會(huì).
hypnotoad 是作者為 Linux 和 Unix 優(yōu)化過的多進(jìn)程的 prefork 的 web 服務(wù)器.全事件支持, 并且有著非常高的性能.
問題2. 我還沒來得及看mojo的代碼。只從目前測(cè)試的結(jié)果看。Feersum和Twiggy是anyevent/EV寫的,用這兩個(gè)東西的時(shí)候plackup啟動(dòng)應(yīng)用,如果代碼中有阻塞的等待,比如$cv->recv,比如$coro->join。這個(gè)時(shí)候server會(huì)報(bào)錯(cuò)退出,提示阻塞了整個(gè)進(jìn)程。這是由于Twiggy的進(jìn)程就是$cv->recv來結(jié)束的,如果其中再有阻塞肯定會(huì)報(bào)錯(cuò)。
我看Mojo::Server::Hypnotoad和Mojo::Server::Morbo的文檔介紹,這兩個(gè)都是EV(需要安裝了EV)寫的non-blocking server,為什么我在mojolicious框架里就可以做阻塞等待這種操作recv,join?
正常的基于事件的程序, 是希望整個(gè) web 服務(wù)器支持事件的,不然就是單個(gè)進(jìn)程搞這些事情, 直接 recv 事件就退出一個(gè)條件了.所以如果想 plackup 啟動(dòng)這些程序沒有問題,需要指定后端服務(wù)器為 Feersum 和 Twiggy. 這時(shí)我想就不會(huì)出錯(cuò)了.
在我的應(yīng)用中,如果是使用 Feersum 的時(shí)候,我會(huì)使用它的原生模式.因?yàn)榧恿藀lack 性能就會(huì)下降不少. 在 Feersum 原生模式有著 nginx 的性能.
另外,還有個(gè)理解上的問題, 在你的事件程序中, 你需要知道,你的整個(gè) Web server ,象 Feersum 本身就是相當(dāng)一個(gè)大的事件集.它在整個(gè)程序的最外層有一個(gè)一直在等永遠(yuǎn)不可能接收到的 recv (類似 EV::run).
所以,在使用基于事件的 Web server 的程序中,你要給 recv 理解成 run (多個(gè) recv 當(dāng)然就不是這樣), 是用于讓事件循環(huán)開始的條件. 如果使用 EV ,你可以給他理解成 EV::run. 這時(shí), 象 AnyEvent::HTTP 之類, 都不在需要使用 recv 讓這個(gè)事件開始跑起來,只需要正常的寫就好了. 不要考慮 AE 中的 cv 這步了.
|
|