perl的AE和coro用了很多年,但是用来搭服务化框架的时候,被一个问题困扰了一年。
就是在web框架中如何使用coro。
之前一直都是在coro 中使用AE模块,完全没有问题。
但是在AE里面用coro,倒是很少。
直接在事件循环里面用coro, 会报block itself的错误。
昨天在看博客的时候,看到ae::socket+coro::handler的配合,突然灵光一现。
unblock就可以了吧。
果然,问题迎刃而解了。
之前也想到了unblock_sub。但是用法不对。再次感慨正确和错误总是只差一线。
#!/bin/env perl
#继续尝试和coro的整合
#成功了!
use Coro;
use Coro::EV;
use AnyEvent;
use Coro::AnyEvent;
use AnyEvent::HTTP::Server;
use EV;
my $s = AnyEvent::HTTP::Server->new(
host => '127.0.0.1',
port => 5000,
cb => sub {
my $req = shift;
#return sub { #这样不行
return unblock_sub { #这样就可以了
my ($is_last, $bodypart) = @_;
Coro::AnyEvent::sleep 1;
$req->reply(200, "<h1>Reply message</h1>", headers => { 'content-type' => 'text/html' });
}
}
);
$s->listen;
$s->accept;
EV::loop();
同样的,mojo app加上unblock_sub也可以使用coro了
#!/usr/bin/env perl
#验证mojo里面可以放协程(ok)
use Mojolicious::Lite;
use Coro;
use AnyEvent;
use Coro::AnyEvent;
#use Mojo::Server::Prefork;
#get '/' => sub {
get '/' => unblock_sub {
my $self = shift;
Coro::AnyEvent::sleep 1;
$self->render(text => $self->tx->remote_address);
#$self->render(text => $msg);
#$self->render(text => "hello mojo");
};
# app->config(hypnotoad => {listen => ['http://*:3080']});
app->start;
本文分享了作者在Perl中将AE模块与Coro模块整合的经验,解决了在AE事件循环中使用Coro遇到的blockitself错误问题,并通过unblock_sub成功实现了两者的结合使用。
237

被折叠的 条评论
为什么被折叠?



