免费注册 查看新帖 |

Chinaunix

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

请教:mojolious中的write_chunk是非阻塞的,如果当做阻塞用,连续调用丢失数据吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-26 22:11 |只看该作者 |倒序浏览
假如第一次调用数据还没写完,接着又调用第二次,会不会导致第一次的部分数据丢失?
用下面简单循环测试没问题,但是不敢确定。
主要是对非阻塞理解不深。

# more Example.pm
package MyMojoliciousApp::Example;
use Mojo::Base 'Mojolicious::Controller';

# This action will render a template
sub welcome {
  my $self = shift;

for my $i (1..10000){
   $self>write_chunk("$i==================================================================\n");
}

$self->finish;

}

1;

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
2 [报告]
发表于 2012-12-27 10:27 |只看该作者
正常的设计上来讲,每来一个连接都会 new 一个新的对象。这样是相互不影响的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-12-28 06:44 |只看该作者
你这个和是不是非阻塞没关系。正常的设计是不是非阻塞都不会影响最后结果。

论坛徽章:
0
4 [报告]
发表于 2012-12-29 17:20 |只看该作者
本帖最后由 fdimim 于 2012-12-29 17:36 编辑

刚把这个框架的主要流程(Hypnotoad启动、fork,app启动,app与daemon的连接)看完了,发现连续write是没问题的,因为每次write都是追加到buf里的。

3.7版本的:
Controller.pm的write最终调用了 Content.pm的write:
sub write {
  # Add chunk
  if (defined $chunk) { $self->{body_buffer} .= $chunk }
……

所以在加了下面的打印:
sub welcome {
……
for my $i (1..4){
   $self->write("$i");
   $self->app->log->error($self->res->content->{body_buffer});
}

最后日志显示:
[Sat Dec 29 17:15:08 2012] [error] 1
[Sat Dec 29 17:15:08 2012] [error] 12
[Sat Dec 29 17:15:08 2012] [error] 123
[Sat Dec 29 17:15:08 2012] [error] 1234
说明写的内容都追加缓存了。

论坛徽章:
0
5 [报告]
发表于 2012-12-29 17:42 |只看该作者
本帖最后由 fdimim 于 2012-12-29 18:22 编辑

顺便问一下,各位都是用什么编辑器阅读代码的,有没有好的推荐? 这点代码看了将近两天,没好工具比较影响。

我开始用notepad++,看这种大型点的太费劲了。
后来改为source insigth好了很多,不过有时symbos窗口显示的函数不完整,部分函数名不显示。
并且对utf8的文件,不能显示汉字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP