有没有办法允许多个连接到 Dancer2

Is there a way to allow multiple connections to Dancer2

我的程序:

#!/usr/bin/perl

use strict;
use warnings;
use Dancer2;

$| = 1;

set host => '127.0.0.1';
set port => 7071;

get '/foo' => sub {
    `sleep 5`;
    'ok'
};

start;

那我就是运行下面的for循环:

for i in $(seq 1 3)
> do
>   time curl http://localhost:7071/foo &
> done

输出:

ok
real    0m5.032s
user    0m0.013s
sys     0m0.000s
ok
real    0m10.037s
user    0m0.012s
sys     0m0.000s
ok
real    0m15.043s
user    0m0.004s
sys     0m0.008s

Dancer2好像一次只能接受一个请求,如何允许Dancer2多次连接?

Perl 程序一般是single-threaded。如果你想同时处理多个事情,你需要明确地管理它。

  • 您可以 运行 Dancer 应用程序的多个实例。当一个实例繁忙时,其他实例仍然可以处理请求。有些服务器自动支持这样的“pre-forking”,例如Starman。这是针对您的问题的经典解决方案,并且观察到您的后端不应该做很多阻碍执行的事情。

  • 您可以明确编写您的应用程序以异步方式工作。您的 sleep 调用会阻止整个过程,但您也可以使用库让您在某些事件发生时恢复处理请求。例如,Dancer2 文档显示了使用 AnyEvent 计时器的示例。

如果你熟悉JavaScript中的Express web框架,一般采用第二种方式:NodeJS不会让你通过休眠来阻塞进程,而是要求你使用promises(async/await) 或回调以明确说明异步执行。

上次我设置了一个舞者应用程序,使用了 plackup 和 Starman 所以提供了一个 PSGI 接口。

cd $APP_DIR    
$PLACKUP -E $ENV -s Starman  --workers=20 -p 9000 \
                     -a bin/app.pl 2>&1 >  $LOGFILE &

perl 前面有一个反向代理,可以更快地处理静态文件,并在更常用的工具中为 Perl-deficient 提供一些 anti-cracking 保护。

simbabque 的回答更好。它显示了这个选项和其他选项。

感谢amon的建议,我已经通过以下代码解决问题(foo.pl):

#!/usr/bin/perl

use strict;
use warnings;
use Dancer2;

$| = 1;

get '/foo' => sub {
    `sleep 5`;
    'ok';
};

to_app;

和运行程序为:

$ plackup -s Starman foo.pl
Resolved [*]:5000 to [0.0.0.0]:5000, IPv4
Binding to TCP port 5000 on host 0.0.0.0 with IPv4
Setting gid to "0 0 0"
Starman: Accepting connections at http://*:5000/

那我就是运行下面的for循环:

for i in $(seq 1 3)
> do
>   time curl http://localhost:5000/foo &
> done

输出:

ok
real    0m5.077s
user    0m0.004s
sys 0m0.010s
ok
real    0m5.079s
user    0m0.001s
sys 0m0.012s
ok
real    0m5.097s
user    0m0.009s
sys 0m0.004s

现在 Dancer2 可以接受多个请求。