免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: py
打印 上一主题 下一主题

[详细介绍]Perl的web框架Mojolicious与异步数据库操作(有数据库操作的朋友一定要看) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2013-12-08 19:50 |只看该作者
回复 1# py


   

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
22 [报告]
发表于 2014-03-25 19:35 |只看该作者
本帖最后由 seufy88 于 2014-03-25 21:22 编辑
py 发表于 2013-10-22 07:44
回复 11# 兰花仙子

感谢仙子加精。


请问这里提到了fork来实现异步,
之前你也提到了非阻塞也能实现异步
可是在只有一个process的情况下,非阻塞怎样实现异步?

"我先说完美的异步数据库操作的应该是什么样的。假设有一个web页面涉及5个sql查询操作,每个操作耗时1秒,在只有一个worker的情况下(单进程),如果有一个人访问这个页面,读取时间应该是1秒。如果有10个人同时访问这个页面,10个人都应该在1秒钟之内看到页面(理想状况下)。"

"Mojolicious,轻松实现"

单个process的情况下,既然每个SQL查询要1秒,理想异步下,5个SQL查询也只需要1秒.
"比如你上面说的同时发生的5个数据库异步查询,可能是通过非阻塞的方式实现的"
请问,怎么非阻塞来实现这个5个SQL查询的异步?

补充:
使用AnyEvent注册一个IO Watcher,

callback中是打印从STDIN得到的内容
/********************/
anyvent->io(
.....
cb=> sub { $str = <STDIN>; print "$str\n",$cv->send;});

foreach(1..15){ do something else}


$cv->recv;

/***************/
实际运行上面的例子发现,只有当foreach的内容处理完了,才会处理Event事件,
即使在foreach运行过程中,从STDIN输入内容,也不会触发cb的

如果把foreach 这一部分换成SQL查询, io watcher也变成SQL查询,
是否应该是以BLOCK这样的来
{
SQL 查询1

}


{

SQL 查询2
}

....

{

SQL 查询5
}

但总的时间仍只需1秒

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2014-03-26 11:33 |只看该作者
seufy88 发表于 2014-03-25 19:35
请问这里提到了fork来实现异步,
之前你也提到了非阻塞也能实现异步
可是在只有一个process的情况下,非 ...


正常情况下,所谓的异步,就都应该是通过非阻塞实现的。用多进程的办法实现非阻塞属于矮级。因为牺牲了一部分性能,但一些时候换来了稳定性。所以anyevent作者选择了后者写了AnyEvent:BI

非阻塞方式的异步,总的来说就是通过注册事件+回调的形式。这楼的主贴主要说的是mysql,mysql的API(DBD::mysql)本身是支持非阻塞的,因为mysql C API就支持非阻塞。所以AnyEvent:BI::MySQL模块才能借助此特性。详细看这里http://search.cpan.org/~capttofu ... SYNCHRONOUS_QUERIES
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP