5

我像这样设置了一个快速的 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,但前提是它一次可以处理多个客户端。

4

4 回答 4

9

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

plackup -s Starman --port 3000 Mojolicious.pl
于 2011-07-20T21:55:00.450 回答
3

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

于 2011-07-25T22:58:39.393 回答
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;
于 2012-02-01T18:47:48.233 回答
0

一次实现多个连接的轻松方法是用“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-06-06T05:48:04.600 回答