2011-07-20 13 views
5

I setup szybkie Mojolicious serwer tak:Perl Mojolicious - Jak sprawić, by obsługiwał wiele połączeń naraz?

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; 

I wtedy zaczynają go z: perl Mojolicious.pl daemon --listen=https://127.0.0.1:3000

Problem jest, jeśli uruchomię tę komendę dwutorowo:

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

Wydaje używać tylko jednego wątku dla żądań, ponieważ jeśli wykonam wiele żądań naraz, mogą one trwać znacznie dłużej niż 5 sekund. To tak, jakby wszyscy byli w kolejce.

Czy tu czegoś brakuje? Chcę używać Mojolicous, ale tylko wtedy, gdy może obsłużyć więcej niż jednego klienta naraz.

Odpowiedz

9

mojo daemon to samodzielny serwer HTTP przeznaczony do użytku programistycznego, a nie do produkcji, i uruchamia tylko jeden wątek. Do produkcji, co chcesz użyć opcji fastcgi i FastCGI-wspieranie WWW, lub zainstalować piękny PSGI serwer -Kompatybilny jak Starman lub Starlet lub Plack::Handler::FCGI lub Fastpass a następnie zrobić

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

Więc jeśli ustawię to, aby uruchomić na przykład w Apache. W ogóle nie miałby problemu? Właśnie zauważyłem, że wywołałem wywołanie 'fork', jednak działa ono pod demonem. – jonathanpeppers

+0

Dodatkowe pytanie, czy to jest ustawienie dla FastCGI, czy uruchomi nowy proces dla każdego żądania? – jonathanpeppers

3

Radzę przeczytać drobnym Instrukcja z Mojolicious. Przewodniki są bardzo ważne. W szczególności sekcje dotyczące Hypnotoad - wbudowanego wstępnego rozwidlenia serwera WWW.

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

bezbolesny sposób na osiągnięcie wielu połączeń jednocześnie ma zastąpić "demon" za "prefork" (może to działa nawet lepiej niż HYPNOTOAD):

Od:

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

Aby :

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

można go przetestować się z:

#!/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'); 

Jest to punkt odniesienia:

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

Wyniki:

(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 

Idealnie byłoby, że całkowity czas byłby zbliżony do 10 sekund ... ale raj” t znaleźć sposób na poprawę tych czasów (jeszcze).

Powiązane problemy