PythonでジョブキューするといえばやっぱりCeleryがスタンダードなんだろうか。RQというシンプルなジョブキューライブラリもあるんですけど、今回はCeleryを動かしてみる。
インストールは簡単。
pip install Celery
バックエンドはRabbitMQかRedisで使うのが良さそうです。手元の環境にRedisが入っていたのでそのままRedisを使ってみます。
from celery import Celery app = Celery('tasks', broker='redis://localhost:6379/0') @app.task def task(message): return "Hello {0}".format(message)
上記をjob.pyとして保存しておきます。で、このjob.pyをワーカーとして起動。このワーカーがデキューしてくれます。
$ celery -A job worker --loglevel=info
いろいろログを出力して起動してくれます。ワーカーの起動はいろいろオプションがあります。デーモンとして動かしたり並列で大量に立ち上げたり。非常に便利。
で、エンキューはもうインタラクティブシェルでもできます。
$ python Python 3.4.2 (default, Oct 16 2014, 01:53:40) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from job import task >>> task.delay("World.")
エンキューもこれだけ。
で、エンキューするとさっき立ち上げたワーカーの方でデキューしてジョブを捌いてくれます。
succeeded in 0.0014186919997882796s: 'Hello World.'
こんな簡単にジョブキューの仕組みが作れるなんて。