PythonのJob Queue、Qamasu
2009年07月02日(木) 00:43
世の中Message Queueバヤリですね!
でも、そんなごっついのいらないんです。ただのJob Queueが欲しいんです。
theschwartzとかQudoとかすてきなものがPerlにはあるんです。
そこで、theschwartzとかQudoとかを駄目にした感じのものを作り出しました。
経緯的に謎なクラス構造ですが気にしない><
http://bitbucket.org/tsuyukimakoto/qamasu/wiki/Home
qamasuはDjangoのアプリケーションという単位で作ってます。きっとそのうちWebインターフェースがつきます(WebというかHTTPというか)。
Djangoの使い方がわからない人は、まず拙著を…
Comments
[2009年09月23日(水) 23:05]
saelxkidd
Qamasu便利そうですね。
実は現在作成中の案件で、これと同様の処理を実装しようとWebを散策していたところでした。
最初、Exampleをみた時は "?" という具合でしたが、動かしてみると"!"という感じで、シンプルな利用法に関心致しました。
また、DjanogAppとして組み込まれているのも非常に良いと思います(別プロセスだと監視とか大変なので)
問題は、Qamasuを実際にDjangoアプリケーションで利用する場合、どこでqamasu.work()を動作させるべきか考え中です。
パっと考えついたのが、utils用のappを作成し、view等でthreadingモジュール等を用いてqamasu.work()をずっと回しておくという具合でしょうか。
もしよろしければ、露木様の利用方法を教えていただければ幸いです
では!
[2009年09月26日(土) 22:22]
makoto
Djangoのコードは環境変数をきちんと設定すれば簡単にシェルから実行できるのがよいところです。
ですから、キューをさすのはDjangoのviews等からでよいと思いますが、ワーカーはTheSchwartzを使う場合と同様にdaemontoolsのsupervise等を使って常時起動させるのが吉だと思います。
(CPUのコア数ぴったりのワーカーを常時起動させます)
速度や効率はあまり考慮していないので、実案件で利用する際にはしっかり検討をしてください :)
#特にデバッグモードで動かさないように注意してください。SQLのデバッグ情報が延々たまるので早々にメモリがヤバくなります
要改善点等ありましたらパッチウェルカムです!
[2009年09月28日(月) 16:53]
salexkidd
コメントTHXです。
とにかく興奮しつつQamasuを現在開発してるものに利用してみました。
結果はかなり良好で、期待通りに動いてくれて感動モノでした。
露木様に示していただいた例のように、qamasu.work()自体は現在 ./manage.py shellして動作させてテストをしております。
まだ、Qamasu自体の中身についてもぐっていないため、パッチ云々Lvではないですが、何かあったらご報告いたします。
では!
[2009年10月08日(木) 00:11]
salexkidd
こんばんわ。salexkiddです。
あれからも順調にQamasuを利用していたのですが、少々小さな問題が起きました。
現象としては、MySQLでqamasu_jobのテーブルに対して"MyISAM"ではなく、"InnoDB"エンジンを利用した場合、
Workerが新たに登録されたJobを探せないという問題が起きております。
多分ですが、DBのトランザクション周りが問題になっているのかもしれません。(Workerを再起動すればJobを探せるようなので)
現在Qamasuのソースを見せていただきながらデバッグを行っていますが、何か思い当たる点等ありましたら
御指南いただければと思います。
こちらでも何かわかりましたらまた書き込み指せていただきます。
では!
[2009年10月10日(土) 18:29]
makoto
はて、transactionは(ついimportしてしまってますが)使っていないのですが…
余裕のあるときに試してみます :'-(
[2009年10月11日(日) 02:17]
makoto
MySQLのTransactionの問題のようです。
http://groups.google.com/group/django-users/browse_thread/thread/e25cec400598c06d/
ワーカーを動作させているスクリプトからのコネクションを、上記リンクのようにセットしておいてやればよいようです。
>>> from django.db import connection
>>> connection.cursor().execute('set transaction isolation level read committed')
これをどこに挟むべきか、少し悩みます。
[2009年10月11日(日) 23:32]
makoto
qamasuをworkさせる前に、MySQLへの接続セッションのトランザクション隔離レベルを変えてみてください。
from django.db import connection
connection.cursor().execute('set session transaction isolation level read committed')
接続セッションのトランザクション隔離レベルがかわるはずですが、ほかに影響がないか、必ず確認をしてくださいね。
