- 论坛徽章:
- 1
|
本帖最后由 iakuf 于 2013-10-18 17:34 编辑
回复 1# py
问题1. morbo和hypnotoad从介绍上看是完全一样的,难道唯一的区别就是hypnotoad是Prefork的。。?
morbo 是单进程,默认用来做测试用, 你可以一边修改代码,他会自动 reload 加载你的修改. 只要你的修改的代码是在 lib templates 目录下. Dancer 的测试用 Web 服务器也是这样,但是程序本身有大的错会自动退出.但 Morbo 不会.
hypnotoad 是作者为 Linux 和 Unix 优化过的多进程的 prefork 的 web 服务器.全事件支持, 并且有着非常高的性能.
问题2. 我还没来得及看mojo的代码。只从目前测试的结果看。Feersum和Twiggy是anyevent/EV写的,用这两个东西的时候plackup启动应用,如果代码中有阻塞的等待,比如$cv->recv,比如$coro->join。这个时候server会报错退出,提示阻塞了整个进程。这是由于Twiggy的进程就是$cv->recv来结束的,如果其中再有阻塞肯定会报错。
我看Mojo::Server::Hypnotoad和Mojo::Server::Morbo的文档介绍,这两个都是EV(需要安装了EV)写的non-blocking server,为什么我在mojolicious框架里就可以做阻塞等待这种操作recv,join?
正常的基于事件的程序, 是希望整个 web 服务器支持事件的,不然就是单个进程搞这些事情, 直接 recv 事件就退出一个条件了.所以如果想 plackup 启动这些程序没有问题,需要指定后端服务器为 Feersum 和 Twiggy. 这时我想就不会出错了.
在我的应用中,如果是使用 Feersum 的时候,我会使用它的原生模式.因为加了plack 性能就会下降不少. 在 Feersum 原生模式有着 nginx 的性能.
另外,还有个理解上的问题, 在你的事件程序中, 你需要知道,你的整个 Web server ,象 Feersum 本身就是相当一个大的事件集.它在整个程序的最外层有一个一直在等永远不可能接收到的 recv (类似 EV::run).
所以,在使用基于事件的 Web server 的程序中,你要给 recv 理解成 run (多个 recv 当然就不是这样), 是用于让事件循环开始的条件. 如果使用 EV ,你可以给他理解成 EV::run. 这时, 象 AnyEvent::HTTP 之类, 都不在需要使用 recv 让这个事件开始跑起来,只需要正常的写就好了. 不要考虑 AE 中的 cv 这步了.
|
|