Perl Mojolicious - Как заставить его обрабатывать несколько соединений одновременно? - PullRequest
5 голосов
/ 21 июля 2011

Я настроил быстрый сервер 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 ]

9 голосов
/ 21 июля 2011

mojo daemon - это отдельный HTTP-сервер, предназначенный для использования в разработке, а не для производства, и он работает только в одном потоке. Для производства вы можете либо использовать опцию fastcgi и веб-сервер с поддержкой FastCGI, либо установить хороший PSGI -совместимый сервер, такой как Starman или Starlet или Plack :: Handler :: FCGI или Fastpass и затем

plackup -s Starman --port 3000 Mojolicious.pl
3 голосов
/ 26 июля 2011

Я рекомендую Чтение The Fine Manual of Mojolicious . Руководства очень важны. В частности, разделы, касающиеся Hypnotoad - встроенного веб-сервера предварительной разветвления.

2 голосов
/ 01 февраля 2012
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 голосов
/ 06 июня 2016

Безболезненный способ установить несколько соединений одновременно - заменить «демон» на «префорк» (он может даже работать лучше, чем гипнот).

С:

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 секундам ... но я не нашел способа улучшить это время (пока).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...