Chinaunix

标题: 【总结】如何把阻塞的Perl模块重新实现成非阻塞模块 [打印本页]

作者: py    时间: 2014-10-22 06:26
标题: 【总结】如何把阻塞的Perl模块重新实现成非阻塞模块
前几周看了一下Mojo::Pg这个模块,总结了一下把阻塞的Perl模块重新实现成非阻塞模块的方法。

Mojo::Pg这个模块算是Mojolicious作者给大家写了一个很好的例子。仔细看能学到很多东西。

在用于进行网络连接的Perl的模块中,我按照网络连接是否阻塞把他们分成三种。
1. 很多老一些的模块都是阻塞的,比如Net::FTP,DBD::Oracle, BerkeleyDB
对于第一类模块,要改成非阻塞的,在不改动原有代码的情况下就只能通过fork一类的方法实现了。另外的办法就是整个用
AnyEvent::Socket/Coro::Socket,Coro::Handle等模块从写。工程比较大。

2. 还有一些比较老的模块,他们虽然是阻塞的,但提供了非阻塞的参数,比如DBD::mysql,DBD::Pg,Net::LDAP等等。
主要说这部分。这一类模块要改成非阻塞相对于前一类要容易的多,只要善加利用阻塞参数,设计和封装一个新的API就可以了。但说实话我对于如何设计这个东西完全没头绪也没有思考过,如果要我做,我肯定是去看一些已有的实现(比如AnyEvent::DBI::MySQL),然后按葫芦画瓢。
最近Mojolicious作者因为MongoDB 文档的原因准备放弃Mango模块的维护权,转而开始了对PostgreSQL的支持,写了Mojo::Pg模块。看这个模块的代码实现能够很好的学习Mojo实现的非阻塞的设计,并且可以重用很多作者的代码。Mojo::MySQL就是个很好的例子,它复制了几乎所有Mojo::Pg的代码实现了一个MySQL的异步数据库连接。有兴趣的朋友可以看看异步实现的部分https://metacpan.org/source/SRI/ ... Pg/Database.pm#L132
Mojolicious作者写的文档个人觉得还是不够好的,文档结构组织的不好,给最终用户使用的部分说的比较详细,但涉及到和AnyEvent一个级别的模块,比如Mojo::IOLoop,文档说明就太不够了,远不如AnyEvent模块文档介绍的那么详细,这次作者写的Mojo::Pg模块是个非常好的例子,可以很好的理解异步实现的方法。

3. 一些新的模块是非阻塞的,比如AnyEvent::HTTP,AnyEvent::DBI::MySQL,Mojo::Mysql,Mojo::Pg等等
上面举的这几个例子都是比较完美实现异步通讯的,但也有用fork类方法实现的,在挑选模块的时候最好是看清文档,比如AnyEvent::DBI模块就是fork实现的。
作者: laputa73    时间: 2014-10-22 07:21
学习了。也去翻翻源码看。

作者: bikong0411    时间: 2014-10-22 09:38
总结的不错
作者: huang6894    时间: 2014-10-22 11:19
谢谢楼主。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2