PythonでQueue制御をする場合、Celeryなどが定番ですが、Amazon SQSを使ったPyQSというのを見つけたのでちょっと使ってみました。READMEとは微妙に挙動が異なるので苦労しましたが、非常にお気軽なTask Queue構築が可能なのはありがたいです。
設置
設置は簡単でpipコマンド一発です。
pip install pyqs
環境変数
以下の環境変数が必要です。
-
AWS_ACCESS_KEY_ID
AWSS_SECRET_ACCESS_KEY
...Amazon SQSへのRead/Write権限を備えていること -
PYTHONPATH
...Queueで実行するPythonスクリプトを参照できるようにしておきます
タスク
pyqsからデコレーターtask
をインポートして、Queueに登録したい関数に載せます。
qqq/tasks.py
from pyqs import task
@task('queue0')
def another_task(message):
print "another_task: message={}".format(message)
@task('queue0')
def send_email(subject):
print "send_email: subject={}".format(subject)
Queueへの登録
add_queue.py
from qqq.tasks import another_task, send_email
from settings import config
for i in range(0, 100):
send_email.delay(subject='hogehoge')
another_task.delay(message='hogehogehoge')
Workerの起動
run_queue.sh
#! /bin/bash
export PYTHONPATH=`pwd`
export QUEUE='queue0'
pyqs $QUEUE
GithubのREADMEによればQueue名は「queue0.tasks.send_email」とか「queue.tasks.another_task」になるはずですが、実際のSQSはQueue名にピリオドは許してくれないので、@taskデコレータで宣言したqueue0がQueue名になります。ここを理解するまでに2時間くらいソース追いかけましたよ。
まとめ
自力でメッセージブローカーを設定しなくても、Amazon SQSへのアクセス権があれば即Task Queueを作れるのは魅力的です。あとSQSはタダ同然なのもありがたいですね。
## Github
ソースは こちら