2011-07-20 34 views
5

tôi thiết lập một máy chủ Mojolicious nhanh chóng như thế này:Perl Mojolicious - Cách làm cho nó xử lý nhiều kết nối cùng một lúc?

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; 

Sau đó tôi bắt đầu nó với: perl Mojolicious.pl daemon --listen=https://127.0.0.1:3000

Vấn đề là, nếu tôi chạy lệnh này đồng thời:

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

Dường chỉ sử dụng 1 chuỗi cho các yêu cầu, bởi vì nếu tôi thực hiện nhiều yêu cầu cùng một lúc, chúng có thể mất nhiều thời gian hơn 5 giây. Nó như thể tất cả họ đều xếp hàng.

Tôi có thiếu gì đó ở đây không? Tôi muốn sử dụng Mojolicous, nhưng chỉ khi nó có thể xử lý nhiều hơn một khách hàng cùng một lúc.

Trả lời

9

mojo daemon là một máy chủ HTTP độc lập có nghĩa là để sử dụng phát triển, không phải sản xuất và chỉ chạy một chuỗi duy nhất. Đối với sản xuất bạn sẽ muốn sử dụng một trong hai tùy chọn fastcgi và một máy chủ web FastCGI-hỗ trợ, hoặc cài đặt một máy chủ đẹp PSGI -tương thích như Starman hoặc Starlet hoặc Plack::Handler::FCGI hoặc Fastpass và sau đó làm

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

Vì vậy, nếu tôi thiết lập tính năng này để chạy trong Apache, chẳng hạn. Nó sẽ không có vấn đề gì cả? Tôi chỉ nhận thấy đặt một cuộc gọi đến 'ngã ba', làm cho nó hoạt động dưới daemon, tuy nhiên. – jonathanpeppers

+0

Câu hỏi bổ sung, nếu điều này được thiết lập cho FastCGI, nó sẽ chạy một quy trình mới cho mỗi yêu cầu? – jonathanpeppers

3

Tôi khuyên bạn nên đọc hướng dẫn Fine của Mojolicious. Hướng dẫn là rất quan trọng. Cụ thể là các phần liên quan đến Hypnotoad - máy chủ web được cài sẵn trong máy chủ.

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

Cách đau để đạt được nhiều kết nối cùng một lúc là để thay thế "daemon" cho "prefork" (nó có thể thậm chí làm việc tốt hơn so với hypnotoad):

Từ:

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

Để :

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

Bạn có thể kiểm tra nó cho mình với:

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

Đây là điểm chuẩn:

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

Kết quả:

(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 

Lý tưởng nhất là nó sẽ là tổng thời gian sẽ được gần gũi với 10 giây ... nhưng tôi thiên đường' t tìm cách cải thiện thời gian đó (chưa).

Các vấn đề liên quan