環境:
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
ワーカーのコードを書く
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で動かしてみます。