Pyresを使ってみた

Pythonの resque クローンであるところの、 pyres を使ってみましたので、 その使用感を淡々と記録します。

pyresって

pyresRedis をバックエンドに使った、ジョブキューサービスを 提供するPythonモジュールです。 ワーカに実行させたいジョブをあらかじめ登録しておき、 実行したい時にエンキューして使います。 同じような用途のモジュールには Celery なんかがあります。

セットアップ

インストールは以下でOK。

pip install pyres

使い方

まずはバックグラウンドで実行したいジョブを定義します。

import time

class TestJob(object):
    queue = "Spam"

    @staticmethod
    def perform(arg):
        time.sleep(5)
        print arg

次にワーカ(実際にジョブを実行するプロセス)を定義します。

# worker.py
from pyres import setup_logging
from pyres.worker import Worker
from tasks import TestJob

setup_logging()
Worker.run(["Spam"])

で、ワーカ起動。

python worker.py

Webフロントエンドが付属しているので、ワーカが動作しているかを確認してみます。 "0 of 1 Workers Working" と表示されていればOKです。

pyres_web -p 8088
http://image.hexacosa.net/images/container/000000000000043e_M.jpg

エンキューする側のスクリプトは以下です。

# enqueue.py
from pyres import ResQ
from tasks import TestJob

r = ResQ(server="localhost:6379")
r.enqueue(TestJob, 23)
print r.info()

実行して処理されるまでを確認。

python enqueue.py

ワーカ側のログ

2011-09-04 12:11:04 INFO     Found job on Spam
2011-09-04 12:11:04 INFO     Processing Spam since 2011-09-04 12:11:04.905254
2011-09-04 12:11:04 INFO     Forked 5592 at 2011-09-04 12:11:04.907010
23
2011-09-04 12:11:09 INFO     done working

ワーカが処理中であればWebからも処理中かどうかを確認できます。 処理中であれば以下のような感じで表示されます。

http://image.hexacosa.net/images/container/000000000000043f_M.jpg

まとめ

Redisがあれば簡単に動かせますし、 ワーカ自体も Supervisor とかで管理すれば簡単に管理できそうなので、 一度試してみてはいかがでしょうか?

では。