it!モーターサイクルと自転車とキャンプの日々。Lennyでcelery/rabbitmqを動かすメモ技術セロリ、ニンジン、ウサギが好きです(嘘です)。loc2go.comはTCX→KMLのデータコンバートをオンライン=同期で行っているのですが、サーバは重いしクライアントを待たせすぎ(使ってる方、重くてスイマセン)なのでジョブキュー設計を導入したいと考えてました。調べてみるとceleryとRabbitMQが面白そうなのでちょっと試してみた。したシステム概要は、celeryがpythonで書かれたキューマネージャ、バックエンドにはerlangで書かれたRabbitMQ+適当なRDBMSが置かれる。タスク依頼はAMQPを使ってceleryに依頼し、RabbitMQがキューをワーカへ投げる(という理解で合ってるんだろうか)。Lennyの仮想マシンを作ってちょこちょこと。aptで以下を入れる。python2.5python-setuptoolspython-djangoerlang-noxコマンドだとこんなかんじ。erlang-noxRabbitMQはdebがあったので/etc/apt/source.listに以下を追加。mainaptでガツンと入れる。rabbitmq-serverチュートリアル通りにRabbitMQの認証設定をする。“.”celeryとmultiprocessing入れる(pip入ってなかったらここから入れてください)。multiprocessingdjangoのプロジェクトを作る。celerytestINSTALLED_APPSにceleryを追加。データベースは適当に設定します(私はsqlite3を使いました)。[/code]AMQPサーバの設定も加えます。[/code]で、データベースを作るとジョブ管理用のスキーマができあがります。syncdb非同期タスクはcelery.task.Taskを継承して作る。タスクはdjangoアプリケーションで作成する必要があるようなので、mytaskというアプリケーションを作る。mytaskmytask/tasks.pyに以下を書く。内容は「5秒待ってhogehogeと返す」だけ。[/code]celerydはmanage.pyから起動する。タスクはceleryd起動時に読み込まれる。celerydアプリケーションがあればipythonからタスクを呼び出せる。tasksをインポート。[/code]delayメソッドを呼び出すとタスクが走る(他にもあるけどよく知らん)。[/code]resにAsyncResultオブジェクトが入る。[/code]タスクが完了しているかどうかはsuccessful()メソッドを使う。完了していなければFalseが返る。[/code]5秒後に再度実行するとTrueが返る、はず。[/code]値はget()メソッドを使う。#2で熱いネタだったのでとりあえず公開。multiprocessing周りでエラーが出たら、以下のURLのパッチを適用する。is_done()なくなるよ!と指摘をいただいたので修正した。(320)メモクルマ・バイクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。