有没有办法允许多个连接到 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 可以接受多个请求。
我的程序:
#!/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 可以接受多个请求。