EnsekiTT Blog

EnsekiTTが書くブログです。

PythonからCeleryにジョブをキューに突っ込んで実行した話

つまりなにしたの?

Pythonコマンドラインからジョブキューを発行した。
そして、これらをHerokuで動かす(よていやりました*1

環境:

Celery

Celeryは、分散されたメッセージ受け渡しよる非同期タスクキュー/ジョブキューで、リアルタイム操作に向けだけど、スケジューリングにも対応している便利なやつです。
僕は機械学習の学習フェーズなどの時間のかかるタスクを順番に実行したい場合に使っています。Cronでもいいけど、定期的に発行すると一定期間以上学習に時間がかかることがあると破綻するためです。
また、キュー方式だと溜まっているタスクを把握しやすいことも嬉しいことの一つです。

Flask

FlaskはPythonで記述されたマイクロフレームワークです。簡単なウェブアプリならさくっと作れます。(先日までTornadoを使ってましたがドキュメントのわかりやすさでFlaskに移り住みました。)

Heroku

Herokuはsalesforceの提供するPaaS(Platform as a Service)です。ほぼUbuntuのOSにRuby on railsをサポートするものでしたが、最近はいろんなプログラミング言語(今回はPython)を使うことができるようになっています。また、データベースもPostgreSQLにかぎらずRedisも使えます。今回はそんなPythonとRedisを活用します。

環境を整える。

Redisをインストールする
brew install redis
Celeryをインストールする

(virtualenv環境を用意することを推奨します)

pip install celery 
Flaskをインストールする

(virtualenv環境を用意することを推奨します)

pip install flask
ワーカーのコードを書く
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def task(message):
    time.sleep(10) #時間のかかるタスクのフリをする
    return "Hello {0}".format(message) 

動かしてみる

Redisを起動する
redis-server /usr/local/etc/redis.conf
ワーカーを起動する
celery -A job worker --loglevel=info
キューを渡す
% python
Python 3.5.2 (default, Feb  4 2017, 18:33:41)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from jobqueue import task
>>> task.delay("World.")
ワーカーを起動したコンソールでは
[2017-05-05 16:47:03,008: INFO/MainProcess] Received task: jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d]
[2017-05-05 16:47:03,011: INFO/PoolWorker-4] Task jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d] succeeded in 0.0006478669820353389s: 'Hello World.'

こんなんが表示されることが確認できる。

次回はHerokuで動かしてみます。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。