【问题标题】:Perl Mojolicious - How to make it handle multiple connections at once?Perl Mojolicious - 如何让它一次处理多个连接?
【发布时间】:2011-07-20 21:34:48
【问题描述】:

我像这样设置了一个快速的 Mojolicious 服务器:

use Mojolicious::Lite;

get '/' => sub {
    my $self = shift;

    sleep 5; #sleep here, I'm testing multiple connections at once

    $self->render_text('Hello World!');
};

app->start;

然后我开始:perl Mojolicious.pl daemon --listen=https://127.0.0.1:3000

问题是,如果我同时运行这个命令:

time curl https://127.0.0.1:3000/ -k

似乎只使用 1 个线程进行请求,因为如果我一次发出多个请求,它们可能需要超过 5 秒的时间。好像都在排队一样。

我在这里遗漏了什么吗?我想使用 Mojolicous,但前提是它一次可以处理多个客户端。

【问题讨论】:

    标签: perl cgi websocket mojolicious


    【解决方案1】:

    mojo daemon 是一个独立的 HTTP 服务器,用于开发,而不是生产,它只运行一个线程。对于生产,您可能希望使用fastcgi 选项和支持FastCGI 的网络服务器,或者安装一个不错的PSGI 兼容服务器,例如StarmanStarletPlack::Handler::FCGIFastpass,然后执行

    plackup -s Starman --port 3000 Mojolicious.pl
    

    【讨论】:

    • 例如,如果我将其设置为在 Apache 中运行。根本就没有问题吗?我只是注意到给fork打了电话,但是它可以在守护进程下运行。
    • 附加问题,如果这是为 FastCGI 设置的,它会为每个请求运行一个新进程吗?
    【解决方案2】:

    推荐阅读Mojolicious的精品手册。指南非常重要。特别是有关Hypnotoad 的部分 - 内置的预分叉网络服务器。

    【讨论】:

      【解决方案3】:
      use AnyEvent;
      use Mojolicious::Lite;
      
      my @stack = ();
      
      get '/' => sub {
          my $self = shift;
      
          $self->render_later;
          push @stack, AnyEvent->timer ( after => 5, cb => sub {
              $self->render_text('Hello World!');
          });
      };
      
      app->start;
      

      【讨论】:

        【解决方案4】:

        一次实现多个连接的轻松方法是用“prefork”替换“daemon”(它甚至可能比 hypnotoad 更有效):

        发件人:

        app->start('daemon', '-l', 'http://*:8000');
        

        收件人:

        app->start('prefork', '-l', 'http://*:8000');
        

        你可以自己测试一下:

        #!/usr/bin/perl -wl
        
        use Mojolicious::Lite;
        
        get '/' => sub {
            my $self = shift;
            for(my $wait = 10; $wait > 0; $wait--) {
                sleep(1);
            }
            $self->render(text => "OK");
        };
        
        # Uncomment to test hypnotoad. execute: hypnotoad ./this_script.pl
        #app->config(hypnotoad => {listen => ['http://*:8000']});
        #app->start;
        
        # Test Daemon: (Uncomment next line)
        #app->start('daemon', '-l', 'http://*:8000');
        
        # Test Prefork: (Uncomment next line)
        app->start('prefork', '-l', 'http://*:8000');
        

        这是基准:

        $ ab -n 10 -c 10 -s 120 http://localhost:8000/ :
        

        结果:

        (totals)         min  mean[+/-sd] median   max       total time
        daemon:         11008 92020 28464.5 101021  101022   101.022 seconds
        hypnotoad:      10017 31525 18811.0 49030   49033    49.036 seconds
        prefork:        20018 24020 5165.0  20020   30022    30.029 seconds
        

        理想情况下,总时间接近 10 秒...但我还没有找到改善这些时间的方法(目前)。

        【讨论】:

          猜你喜欢
          • 2016-02-18
          • 2018-08-26
          • 2014-11-09
          • 2011-07-17
          • 2011-06-28
          • 1970-01-01
          • 2016-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多