我的程式:
#!/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的多個連接?
uj5u.com熱心網友回復:
Perl 程式通常是單執行緒的。如果你想同時處理多個事情,你需要明確地管理它。
您可以運行 Dancer 應用程式的多個實體。當一個實體忙時,其他實體仍然可以處理請求。一些服務器自動支持這種“預分叉”,例如
Starman. 這是解決您的問題的經典解決方案,再加上觀察到您的后端不應該做很多阻止執行的事情。您可以顯式撰寫您的應用程式以異步作業。您的
sleep呼叫阻塞了整個程序,但您也可以使用庫來讓您在某些事件發生時恢復處理請求。例如,Dancer2 檔案顯示了使用AnyEvent計時器的示例。
如果你熟悉 JavaScript 中的 Express Web 框架,它通常使用第二種方法:NodeJS 不會讓你通過休眠來阻塞行程,而是要求你使用 Promise (async/await) 或回呼來明確說明異步執行。
uj5u.com熱心網友回復:
感謝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 可以接受多個請求。
uj5u.com熱心網友回復:
上次我設定了一個舞者應用程式,使用了 plackup 和 Starman,因此提供了一個 PSGI 界面。
cd $APP_DIR
$PLACKUP -E $ENV -s Starman --workers=20 -p 9000 \
-a bin/app.pl 2>&1 > $LOGFILE &
perl 前面有一個反向代理,可以更快地處理靜態檔案,并為 Perl 不足的更常用的工具提供一些防破解保護。
辛巴克的答案更好。它顯示了這個選項和其他選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464297.html
上一篇:Perl陣列到變數的轉換
