[perl]coro在web框架(mojo,Anyevent::httpserver)中的用法

本文分享了作者在Perl中将AE模块与Coro模块整合的经验,解决了在AE事件循环中使用Coro遇到的blockitself错误问题,并通过unblock_sub成功实现了两者的结合使用。

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;

C:\Users\ZSKBOOK>cpanm Perl::LanguageServer --> Working on Perl::LanguageServer Fetching http://www.cpan.org/authors/id/G/GR/GRICHTER/Perl-LanguageServer-2.6.2.tar.gz ... OK Configuring Perl-LanguageServer-v2.6.2 ... OK ==> Found dependencies: Class::Refresh, Coro, AnyEvent::AIO, Hash::SafeKeys, IO::AIO, Compiler::Lexer --> Working on Class::Refresh Fetching http://www.cpan.org/authors/id/D/DO/DOY/Class-Refresh-0.07.tar.gz ... OK Configuring Class-Refresh-0.07 ... OK ==> Found dependencies: Class::Unload, Devel::OverrideGlobalRequire --> Working on Class::Unload Fetching http://www.cpan.org/authors/id/I/IL/ILMARI/Class-Unload-0.11.tar.gz ... OK Configuring Class-Unload-0.11 ... OK Building and testing Class-Unload-0.11 ... OK Successfully installed Class-Unload-0.11 --> Working on Devel::OverrideGlobalRequire Fetching http://www.cpan.org/authors/id/D/DA/DAGOLDEN/Devel-OverrideGlobalRequire-0.001.tar.gz ... OK Configuring Devel-OverrideGlobalRequire-0.001 ... OK Building and testing Devel-OverrideGlobalRequire-0.001 ... OK Successfully installed Devel-OverrideGlobalRequire-0.001 Building and testing Class-Refresh-0.07 ... OK Successfully installed Class-Refresh-0.07 --> Working on Coro Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/Coro-6.57.tar.gz ... OK Configuring Coro-6.57 ... OK ==> Found dependencies: Guard --> Working on Guard Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/Guard-1.023.tar.gz ... OK Configuring Guard-1.023 ... OK Building and testing Guard-1.023 ... OK Successfully installed Guard-1.023 Building and testing Coro-6.57 ... OK Successfully installed Coro-6.57 --> Working on AnyEvent::AIO Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/AnyEvent-AIO-1.1.tar.gz ... OK Configuring AnyEvent-AIO-1.1 ... OK ==> Found dependencies: IO::AIO --> Working on IO::AIO Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/IO-AIO-4.81.tar.gz ... OK Configuring IO-AIO-4.81 ... OK Building and testing IO-AIO-4.81 ... FAIL ! Installing IO::AIO failed. See C:\Users\ZSKBOOK\.cpanm\work\1752592067.8072\build.log for details. Retry with --force to force install it. ! Installing the dependencies failed: Module 'IO::AIO' is not installed ! Bailing out the installation for AnyEvent-AIO-1.1. --> Working on Hash::SafeKeys Fetching http://www.cpan.org/authors/id/M/MO/MOB/Hash-SafeKeys-0.04.tar.gz ... OK Configuring Hash-SafeKeys-0.04 ... OK Building and testing Hash-SafeKeys-0.04 ... OK Successfully installed Hash-SafeKeys-0.04 --> Working on Compiler::Lexer Fetching http://www.cpan.org/authors/id/G/GO/GOCCY/Compiler-Lexer-0.23.tar.gz ... OK ==> Found dependencies: Module::Build::XSUtil --> Working on Module::Build::XSUtil Fetching http://www.cpan.org/authors/id/H/HI/HIDEAKIO/Module-Build-XSUtil-0.19.tar.gz ... OK Configuring Module-Build-XSUtil-0.19 ... OK ==> Found dependencies: Cwd::Guard, Devel::CheckCompiler, File::Copy::Recursive::Reduced --> Working on Cwd::Guard Fetching http://www.cpan.org/authors/id/K/KA/KAZEBURO/Cwd-Guard-0.05.tar.gz ... OK Configuring Cwd-Guard-0.05 ... OK Building and testing Cwd-Guard-0.05 ... OK Successfully installed Cwd-Guard-0.05 --> Working on Devel::CheckCompiler Fetching http://www.cpan.org/authors/id/S/SY/SYOHEX/Devel-CheckCompiler-0.07.tar.gz ... OK Configuring Devel-CheckCompiler-0.07 ... OK Building and testing Devel-CheckCompiler-0.07 ... OK Successfully installed Devel-CheckCompiler-0.07 --> Working on File::Copy::Recursive::Reduced Fetching http://www.cpan.org/authors/id/J/JK/JKEENAN/File-Copy-Recursive-Reduced-0.008.tar.gz ... OK Configuring File-Copy-Recursive-Reduced-0.008 ... OK Building and testing File-Copy-Recursive-Reduced-0.008 ... OK Successfully installed File-Copy-Recursive-Reduced-0.008 Building and testing Module-Build-XSUtil-0.19 ... OK Successfully installed Module-Build-XSUtil-0.19 Configuring Compiler-Lexer-0.23 ... OK Building and testing Compiler-Lexer-0.23 ... OK Successfully installed Compiler-Lexer-0.23 ! Installing the dependencies failed: Module 'IO::AIO' is not installed, Module 'AnyEvent::AIO' is not installed ! Bailing out the installation for Perl-LanguageServer-v2.6.2. 11 distributions installed C:\Users\ZSKBOOK>cpanm PadWalker PPI PadWalker is up to date. (2.5) --> Working on PPI Fetching http://www.cpan.org/authors/id/M/MI/MITHALDU/PPI-1.283.tar.gz ... OK Configuring PPI-1.283 ... OK ==> Found dependencies: Test::Object, YAML::PP, Test::SubCalls, Safe::Isa --> Working on Test::Object Fetching http://www.cpan.org/authors/id/E/ET/ETHER/Test-Object-0.08.tar.gz ... OK Configuring Test-Object-0.08 ... OK Building and testing Test-Object-0.08 ... OK Successfully installed Test-Object-0.08 --> Working on YAML::PP Fetching http://www.cpan.org/authors/id/T/TI/TINITA/YAML-PP-v0.39.0.tar.gz ... OK Configuring YAML-PP-v0.39.0 ... OK Building and testing YAML-PP-v0.39.0 ... OK Successfully installed YAML-PP-v0.39.0 --> Working on Test::SubCalls Fetching http://www.cpan.org/authors/id/E/ET/ETHER/Test-SubCalls-1.10.tar.gz ... OK Configuring Test-SubCalls-1.10 ... OK ==> Found dependencies: Hook::LexWrap --> Working on Hook::LexWrap Fetching http://www.cpan.org/authors/id/E/ET/ETHER/Hook-LexWrap-0.26.tar.gz ... OK Configuring Hook-LexWrap-0.26 ... OK Building and testing Hook-LexWrap-0.26 ... OK Successfully installed Hook-LexWrap-0.26 Building and testing Test-SubCalls-1.10 ... OK Successfully installed Test-SubCalls-1.10 --> Working on Safe::Isa Fetching http://www.cpan.org/authors/id/E/ET/ETHER/Safe-Isa-1.000010.tar.gz ... OK Configuring Safe-Isa-1.000010 ... OK Building and testing Safe-Isa-1.000010 ... OK Successfully installed Safe-Isa-1.000010 Building and testing PPI-1.283 ... OK Successfully installed PPI-1.283 6 distributions installed C:\Users\ZSKBOOK>cpanm Perl::LanguageServer --> Working on Perl::LanguageServer Fetching http://www.cpan.org/authors/id/G/GR/GRICHTER/Perl-LanguageServer-2.6.2.tar.gz ... OK Configuring Perl-LanguageServer-v2.6.2 ... OK ==> Found dependencies: AnyEvent::AIO, IO::AIO --> Working on AnyEvent::AIO Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/AnyEvent-AIO-1.1.tar.gz ... OK Configuring AnyEvent-AIO-1.1 ... OK ==> Found dependencies: IO::AIO --> Working on IO::AIO Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/IO-AIO-4.81.tar.gz ... OK Configuring IO-AIO-4.81 ... OK Building and testing IO-AIO-4.81 ... FAIL ! Installing IO::AIO failed. See C:\Users\ZSKBOOK\.cpanm\work\1752592572.25820\build.log for details. Retry with --force to force install it. ! Installing the dependencies failed: Module 'IO::AIO' is not installed ! Bailing out the installation for AnyEvent-AIO-1.1. ! Installing the dependencies failed: Module 'IO::AIO' is not installed, Module 'AnyEvent::AIO' is not installed ! Bailing out the installation for Perl-LanguageServer-v2.6.2.
最新发布
07-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值