Controler内でHTTPレスポンスを返してからバックグラウンドで処理を続けたい

29 views
Skip to first unread message

檜山藤七

unread,
Jul 18, 2019, 5:15:48 AM7/18/19
to Mojolicious日本ユーザーグループ
昔CGIで作っていたシステムをMojoliciousに移植しようとしています。

クライアントからの要求を受けてサーバー側でやや重い処理を実行する必要があるのですが、CGI(Apache)のときはclose(STDOUT)することでとりあえずクライアントにレスポンスを返し、サーバー側はその重い処理をバックグラウンドで実行するということが実現できていました。
以下のURLで紹介されているような感じです。
http://nemoplus.hateblo.jp/entry/20050701/1120190648

これをMojoliciousに移植したいと思ったのですが、close(STDOUT)と同じようなことはどうすれば実現できるでしょうか。
以下のようなControllerを作ってみましたが、クライアント側はHTTP要求してから約5秒後に「Fork success~」の結果が返ってくるという状況です。
close(STDOUT)相当のことができていないため当然ですが…
https://pastebin.com/6scd6MXU

Controller#finishかと思いましたが違うようですし、どなたか良い方法をご存知でしたら教えてください。

若林信敬

unread,
Jul 19, 2019, 5:43:30 AM7/19/19
to Mojolicious日本ユーザーグループ
こんばんは。
若林と申します。

私の場合はそのような状況の時、 Mojolicious だけでなく「TheSchwartz」などのワーカーを使用して対応しています。


sub index {
   
my $c = shift;


   
...;
   
my $client = TheSchwartz->new(databases => $DATABASE_INFO);
    $client
->insert('MyWorker', \%args);


   
return $c->render(text => 'success');
}


自前で fork したりするのは大変なので、ジョブキューを使ってみてはどうでしょうか?
以下の記事も参考になると思います。
https://gihyo.jp/dev/serial/01/perl-hackers-hub/001001


2019年7月18日木曜日 18時15分48秒 UTC+9 檜山藤七:

檜山藤七

unread,
Jul 19, 2019, 7:33:53 AM7/19/19
to Mojolicious日本ユーザーグループ
若林さん

こんばんは、ご回答ありがとうございます。

その後の調査でMojolicious::IOLoop::Subprocessを使うことでバックグラウンド処理が実現できそうだったので試しているところですが、教えていただいたTheSchwartzも初めて知ったので調べてみたいと思います。


2019年7月19日金曜日 18時43分30秒 UTC+9 若林信敬:

檜山藤七

unread,
Jul 22, 2019, 1:55:35 AM7/22/19
to Mojolicious日本ユーザーグループ
最終的にこんな感じで実現できたのでご報告しておきます。

2019年7月19日金曜日 20時33分53秒 UTC+9 檜山藤七:
Reply all
Reply to author
Forward
0 new messages