Djangoで時間のかかる処理をキューイングして逃げる方法 の準備
この前書いたスレッドの方法は、うまく動いている。しかし、この方法にはまだいくつか問題がある。
1.重い処理の重複
もしスレッドに登録した方法がDisk I/Oをガリガリしていると、マシンの全体的なパフォーマンスが落ちてしまい、
結局全体にわたってシステムが遅くなってしまう
2.ロック処理
もしスレッドに登録した方法が、現在登録されていない最新のIDを取得し、後からシステム上で利用するようなものになると、
同時にそのスレッドが動作した場合、最新のIDを握りあってしまう場合がある。
上の問題を解決するには、スレッドで動作している重い処理が動いていた状態で、外部から同じ処理を受け付けた場合に
「いまいそがしーからあとでな」という方法。これならば問題は解決する。
しかし、これでは顧客はきっといやがる。「動かそうとすると毎回まてってさ。どういうこっちゃ」言うに決まってる。
そして「何とかしてくださいASPで。さもなくば死んでください」的なことを言われるのは目に見えてる。
となると、もう1つ浮かぶ方法としてはキューイングだ。
とにかく、重い処理を「やっといてね」と渡されたら、それを並べておき、端っこからそれを1つ1つガリガリ処理していく方法だ。
これなら顧客が思い処理を放り込んだら「やっておきますからね。10分くらいかかるけど」的メッセージを出しておく。
これなら客も我慢出来るだろう。
こういう方法をメッセージキューイングと言い、PerlにはTheSchwartzやGearManなどがある。
Pythonはというと、あまりないようだが、DjangoXPythonを出していらっしゃる露木さんが作成したQamasuというのがある。
これは、DjangoのAppとして実装されているので、INSTALLED_APPSに入れて、適切に動かすだけ。
明日はこれをつかって、レビューを行う。