免费注册 查看新帖 |

Chinaunix

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

mojolicious自带的不同server的问题(morbo和hypnotoad) [复制链接]

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

异步和非阻塞这两个词很多时候就混用了。


请允许我再追问一下.

这里所谓的异步,或是mojo里的异步
请问下面的mojo中的异步,是指如果下面两个web 请求都有数据到达了, sub A和  sub B是会"同时"处理 这个意思吗?
$ua ->get('http://abc.com" => sub { A});
$ua ->get('http://def.com" => sub { B});

sub A, sub B可以同时运行,互不影响?

补充:
就是 mojo 中
$ua ->get("web 1" => sub {A});
$ua ->get("web 2" => sub {B});
....
do something else
两次get是非阻塞的,process不会阻塞在这里,
但是如果两个get之后有数据到达了,是先执行 sub A,还是执行sub B?
又或者,如果process正在处理 do sometheing else部分,这时候A的数据可读了,是马上类似中断一样的去处理sub A吗?
如果处理A的过程中,正好B的数据也变为可读了,那么又中断去处理B吗?
还是说,A和B都不会相互影响,也不会影响process处理do something else(如果正在处理的话)

从使用UA模块的来看,好像是A,B互不影响,像是注册了A,B两个事件,事件发生了就各自执行callback,也不会影响到当前process

之所以有这个疑问,是根据LINUX网络编程是:
  1. while(1) {
  2.         非阻塞read(设备1);
  3.         if(设备1有数据到达)
  4.                 处理数据;
  5.         非阻塞read(设备2);
  6.         if(设备2有数据到达)
  7.                 处理数据;
  8.         ...
  9.         sleep(n);
  10. }
复制代码
这上面提到的"非阻塞"来看(不清楚这里的非阻塞和mojo里的是不是一个概念)
在这个例子中,总是在一个process中,我无法理解异步的实现
或是之前你提到的:
"我先说完美的异步数据库操作的应该是什么样的。假设有一个web页面涉及5个sql查询操作,每个操作耗时1秒,在只有一个worker的情况下(单进程),如果有一个人访问这个页面,读取时间应该是1秒。如果有10个人同时访问这个页面,10个人都应该在1秒钟之内看到页面(理想状况下)"

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
22 [报告]
发表于 2014-03-26 06:50 |只看该作者
所谓非阻塞,指的是进程不会阻塞在非cpu计算的操作(主要是慢io)上
在纯cpu计算的操作上,是阻塞的.(单cpu时间片轮转),因为cpu计算需要的时间通常可以短到可以忽略.
所以数据同时到达,以先到达的为准,处理完再处理另一个.(我猜内部肯定有一个事件队列).



论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
23 [报告]
发表于 2014-03-26 10:06 |只看该作者
回复 22# laputa73


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

     0 second
+-----------------------------------------------------
  my Process                    SQL Server
non block SQL 1 ------>             ↓
non block SQL 2 ------>     ↓
non block SQL 3 ------>      ↓
non block SQL 4 ------>       ↓
non block SQL 5 ------>        ↓












total  1 second
+-----------------------------------------------------

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2014-03-26 11:09 |只看该作者
回复 23# seufy88

是的。这里说的1秒并没计算API通过socket发送请求到数据库的时间,也没计算接收数据的时间。

btw. 我记得那个时候看mysql的这个异步特性,“接收数据”期间并不是异步的。不过这还是可以接受的
   

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
25 [报告]
发表于 2014-03-26 12:07 |只看该作者
回复 23# seufy88


  纯cpu和快io的处理时间是可以忽略的
在0s的时候,
  app server同时收到客户端的10个请求(处理时间忽略),
  向socket的发送缓冲顺序写入了10条查询请求(写入时间忽略).  这里是异步的,因为并没有等待返回查询结果才发下一条(需要数据库的api支持).
每个请求从缓冲队列到db server收到处理,返回到接收缓冲的时间最长为1s(这里有个假设,就是db server必须是支持并发请求的)
那么在1s的时候,app server就同时收到了10条结果,然后依次读取并渲染页面(读取时间忽略)
写入到客户端的socket发送缓冲(写入时间忽略)



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP