- 论坛徽章:
- 1
|
本帖最后由 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秒 |
|