我设置了一个像这样的快速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,但前提是它一次只能处理多个客户端。
答案 0 :(得分:9)
mojo daemon
是一个独立的HTTP服务器,用于开发使用,而不是生产,它只运行一个线程。对于生产,您可能希望使用fastcgi
选项和支持FastCGI的网络服务器,或安装一个不错的PSGI兼容服务器,如Starman或Starlet或{{3 }或Plack::Handler::FCGI,然后执行
plackup -s Starman --port 3000 Mojolicious.pl
答案 1 :(得分:3)
我建议阅读Mojolicious的精细手册。指南非常重要。特别是关于Hypnotoad的部分 - 内置的预分叉网络服务器。
答案 2 :(得分: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;
答案 3 :(得分:0)
一次实现多个连接的无痛方法是将“守护进程”替换为“prefork”(它甚至可能比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秒......但我还没有办法改善这些时间(还)。