1

標準構成 (plackup/Starman) で Dancer 1.31 を使用しています。

リクエストで、perl 関数を非同期で呼び出して、リクエストがすぐに返されるようにしたいと考えていました。典型的な「長時間実行操作」のシナリオを考えてみてください。このシナリオでは、更新とリダイレクトで「処理中のページ」を返したいと考えています。

私は(素朴に?)スレッドで試しました:

sub myfunc {  
   sleep 9; # just for testing a slow operation
}

any '/test1' => sub {
   my $thr = threads->create('myfunc'); 
   $thr->detach();
   return "done" ;
};

動作しません。サーバーがフリーズしているようで、エラー ログに何も表示されません。Dancer 内でスレッドを手動で作成することは禁止されていると思いますか? それはPSGIの問題ですか?おすすめの方法は?

4

2 に答える 2

1

特に Web サーバー環境では、perl スレッドには近づきません。それらに参加したり切り離したりすると、サーバーがクラッシュする可能性が高くなります。

私は通常、他のモジュールを初期化する前にいくつかのスレッド (スレッド プール) を作成し、アプリケーションの存続期間全体にわたって保持します。Thread::Queueは、ワーカーとメイン スレッド間の通信を適切に提供します。

私が Perl で見つけた最高の非同期ソリューションはPOEです。Linux では、POE::Wheel::Runを使用して、実行可能ファイルとサブルーチンを非同期で実行することを好みます。fork を使用し、子プロセスとの通信を可能にする美しいインターフェイスを備えています。(Windowsではスレッド依存のため使えません)

同じアプリケーション/スクリプト内で Dancer と POE をセットアップすると、問題が発生し、POE のイベント ループがブロックされる場合があります。POE 専用の単一のワーカー スレッドが便利な場合もあります。または、POE に基づいて別のサーバーを作成し、ソケット経由で Dancer アプリケーションと通信するだけです。

于 2012-10-21T21:09:03.440 に答える