2011-07-20 30 views
5

我建立一个快速Mojolicious服务器这样的:Perl 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

似乎只对一个请求使用一个线程,因为如果我一次发出多个请求,它们可能会花费比5秒多的时间。就好像他们都排队了。

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

回答

9

mojo daemon是一个独立的HTTP服务器,用于开发使用,而不是生产,它只运行一个线程。对于生产,你会想要么使用fastcgi选项和FastCGI的支撑网络服务器,或者安装一个不错的PSGI兼容的服务器像StarmanStarletPlack::Handler::FCGIFastpass,然后做

plackup -s Starman --port 3000 Mojolicious.pl 
+0

所以,如果我把它设置为在Apache中运行,例如。它根本就没有问题?然而,我只是注意到给'fork'打电话,使它在守护进程下运行。 – jonathanpeppers

+0

其他问题,如果这是为FastCGI设置的,它是否会为每个请求运行一个新进程? – jonathanpeppers

3

我建议你阅读精细手册Mojolicious。指南非常重要。特别是关于Hypnotoad的章节 - 内置的预分页webserver。

2
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; 
0

的无痛的方式同时实现多个连接是取代“守护进程”为“预派生”(甚至可能工作比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秒...但我避风港”找到一种方法来改善那些时代(还)。