免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 17139 | 回复: 21
打印 上一主题 下一主题

请问关于Perl的异步框架,AnyEvent,POE和Coro到底有什么不同? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-29 14:52 |只看该作者 |倒序浏览
对于Perl的事件编程看了有一段时间了,对于一些概念的认识还是存在很多混淆,望大家帮忙指正。

先说AnyEvent,本来开始由于flw对POE的宣传想仔细研究POE,但后来发现AnyEvent正在逐渐取代POE。CPAN上也是越来越多的作者放弃POE,转而开始写AnyEvent的模块。这点可以看miyagawa的这个帖子,上面有POE作者和miyagawa的一些交流:
http://bulknews.typepad.com/blog ... -with-anyevent.html
用了一段时间AnyEvent,感觉这东西很容易上手而且功能也很单一,在这过程中我还发现了一个POE和AnyEvent作者的打架贴
http://www.catalyzed.org/2009/06/poe-anyevent321-fight.html
不是为看热闹,主要是想更加了解这两个东西到底有什么不同。

POE。完全没用过POE。对POE的了解仅限于flw的那篇介绍和网上的一些简单介绍。我本以为POE和AnyEvent的功能一样简单,但POE支持session的概念,感觉功能比AnyEvent要强大的多。

我有以下问题想弄明白:
1. 我不明白为什么说POE是框架,而AnyEvent是事件驱动。
因为使用过AnyEvent,感觉AnyEvent就像DBI一样的角色。但从CPAN上提供的代码来看AnyEvent能做的事POE都可以做,而POE能做的事AnyEvent也都可以完成。而且,在2011年Perl大会上,POE和AnyEvent作为异步编程框架,被放在了一起介绍。这让我更加混淆了所谓的“框架”和“事件驱动”。


2. AnyEvent以及POE是否多进/线程?
把Coro一同写在标题里是因为总感觉Coro和AnyEvent以及POE有些关系。我看过CPAN上Coro的介绍,这个作者很有能力,但总是时不时说一些误导性言论。Coro应该是不支持真正意义上的多线程的,但作者就说它是“Coro - the only real threads in perl”。
Coro支持的应该是伪线程,就是microthreads。我想知道这个Coro是否可以跑满多核?AnyEvent在使用Coro的时候是否可以跑满多核?另外,Coro支持coprocesses,虽然我对coprocesses的了解只停留在APU上介绍的内容,但还是想问AnyEvent是不是在使用Coro之后也能实现coprocesses的功能?


3. 想确认一点,AnyEvent中的EV是不是封装了C的libevent?
我看了EV的文档也大概看了一眼EV模块的代码,文档里说是封装的libev,确实是封装的libev。这个libev是那个libevent吗?



TIA

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-11-29 15:10 |只看该作者
最后一个问题我自问自答了,刚查了一下,libev和libevent还真不是一个东西,libevent是很早就有了,libev是2007年开发的,看测试结果应该是好过libevent。作者居然就是AnyEvent的作者。另外,Coro,EV,libev也都是Marc Lehmann写的。难怪从POE和AnyEvent的作者打架贴上看,AnyEvent的作者感觉底子厚

论坛徽章:
0
3 [报告]
发表于 2011-11-29 15:22 |只看该作者
coro 貌似不支持 多核? 我在搜资料的时候看到的,具体不清楚啊。

论坛徽章:
0
4 [报告]
发表于 2011-11-29 16:46 |只看该作者
我不明白为什么说POE是框架,而AnyEvent是事件驱动。


AnyEvent是否跟libevent功能相似的东东,例如epoll?
POE是个服务框架,例如写一个web服务器,你只要填写http协议的处理逻辑就行,其他socket连接与处理、进程/线程池、信号机制等,POE都替你做好了。
我不太清楚AnyEvent是否也是个基于libevent的框架,如果是,那么它与POE的作用就差不多。
如果AnyEvent是指libevent的事件驱动,那它与POE可以互补,例如POE的驱动是进程的、线程的,那么加上libevent,可以变成事务型的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-11-29 17:26 |只看该作者
本帖最后由 flw 于 2011-11-29 17:28 编辑

EV 和 libev 本来就是同一个东西。好多懂 Perl 的作者发布的产品本来就包括 for C 和 for Perl 两个界面。

Coro 和 POE/AnyEvent 没法比,你的观点我基本赞同,作者喜欢误导大家,而且 Coro 很牛逼,但它的实现决定了它的稳定性是有问题的 —— 它假设所有的上层应用都不依赖于底层实现,通过替换底层的方式来直接实现协程(注意不是多线程),非常牛逼,也意味着非常不靠谱。想要用它,就做好充分的边界测试吧!

POE 和 AnyEvent,简单的说,就是 POE 可以给你的程序提供一个骨架,你只要填瓤就可以了。
而 AnyEvent 自己就是瓤,你需要给它提供一个骨架。当然了,它可以和其它瓤很好地一起工作,甚至是 POE。

如果你可以很好地驾驭几千行甚至是上万行的工程,那么 AnyEvent 用起来很不错,但对我来说,由于历史的原因,我更加熟悉 POE,因此我用 POE 可以快速地构建几千行甚至是上万行的工程。

POE 的最大问题是性能问题,大概是 POE 的内核实现过于复杂了,和其它 driver 如 EV 的的耦合又缺乏实践(版本很旧【注1】)。AnyEvent 就好多了,和 EV 是同一个作者,但它的设计风格很糟,典型的码农作品,缺乏针对上层建筑的抽象。

POE 的上层建筑就好多了,Kernel、Session、Driver、Filter、Whell、Component 层次分明,整体上来看和 OTP/Erlang 的几乎是同构的,又有 IKC/Peek::API 等神器,就算说是 CPAN 上一枝独秀也不为过。配合 OTP 设计原则,就可以构建出非常庞大的集群。

总而言之,我认为 AnyEvent 和 POE 结合会是一个很不错的思路:大框架用 POE,高并发就用 AnyEvent,反正在 POE 中 fork 一个进程也是非常容易的一件事。

哦,最近在看 Node.js,发现 Node.js 有点像 AnyEvent,但又比 AnyEvent 好很多,这也似乎说明了现在特别流行这种事件驱动/消息驱动的编程模式。

临了说一句:AnyEvent 不支持自定义消息,这一点太令人大跌眼镜了!条件变量什么的,hold 不住啊!


【注1】我原来不知道为什么 POE::Loop::EV 的版本那么旧,今天看了 AnyEvent::Impl::POE 里作者的一句话,才明白。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-11-29 17:37 |只看该作者
libevent  很经典,就如同 POE 很经典一样。
EV 性能很好,就如同 AnyEvent 性能很好一样。

Coro 就是打酱油的,如同 Perl6 一样,惊艳但不实用。需要大量小白鼠验证,我曾经用过 Coro,效果非常好,但也遇到了很多问题。所以我愿意把 Coro 作为死马当活马医、起死回生的灵丹妙药。大规模会战还是 POE 能够让我放心,性能问题全部通过子进程来解决。反正 Perl 很少做高性能服务器的开发,就算是做,也不太可能直接用 POE/AnyEvent。一般的计算型的程序,如果不放到单独的进程,别说是 AnyEvent,就是神仙来了都没用,一定会卡住整个程序。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2011-11-29 17:37 |只看该作者
顺便说一句,如果有兴趣和我长期讨论这些的,可以给我发简历,2012 高薪诚聘大量研发工程师。

论坛徽章:
0
8 [报告]
发表于 2011-11-29 18:17 |只看该作者
能引来版主大量回复的贴子基本都是我看不懂的,努力学习吧.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2011-11-30 08:24 |只看该作者
AnyEvent是否跟libevent功能相似的东东,例如epoll?
POE是个服务框架,例如写一个web服务器,你只要填 ...
zuerrong 发表于 2011-11-29 16:46


AnyEvent更推荐使用EV,用的是libev,按照作者提供的测试结果,libev是比libevent更优的底层驱动。
你说的POE的功能AnyEvent都能实现,但就像flw所说,AnyEvent缺少很多“上层建筑”。估计就是因为此,POE才被称为框架。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2011-11-30 08:24 |只看该作者
感谢flw解释,其实发这帖子就是指望你帮忙解惑的。
POE和AnyEvent的关系我已经明白了,你的解释非常清楚。
我的工作内容不是很单一,有时候需要用Oracle计算大量数据,非要跑满所有的核才能快速完成作业,所以就注意到了Coro

我最近在反复思考我做过的一个项目的性能问题,最后发现造成性能缺陷的原因就是我最初设计的不好。后来发现AnyEvent能极其完美的解决我的问题,从根本上改变了思考问题的流程,让一些复杂的问题简单化。后来看到你介绍POE的文章,就也开始了解POE。

现在能体会你为什么推POE这样的框架了。东西想做大,用这么个靠谱的东西是很明智的。

AnyEvent我还是刚开始使用,以后遇到想不明白的东西还得来这里问。


ps.给你发站内短信了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP