celery
Homepage | Celery: Distributed Task Queue
tutorial
First Steps with Celery — Celery 4.2.0 documentation
brokerを選ぶ
redisを使う場合。 rabbitMQはIoTとかで使うかもだけど、、
Using Redis — Celery 4.2.0 documentation
celeryを使わずに、redisのqueueで簡単?にやりたい場合は、RQ: Simple job queues for Python
install ok
application
app(worker)の作成
code:tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379')
@app.task
def add(x, y):
return x + y
app(worker)を動かす
$ celery -A tasks worker --loglevel=info
-Aはアプリ名 ここではファイル名(tasks.py)なので、tasks,
コマンド名?の worker(Start worker instance.).
他には、 events, beat, shell, multi, amqp (Main)がある。 $ celery --helpで色々出てくる
ctl+Zで、停止して jobをcheck
$ jobs -l
[1]+ 22136 Stopped celery -A tasks worker --loglevel=info
app(worker)を呼ぶ
別のターミナルで、tasks.pyから add関数をimportして、add()する
code:python
from tasks import add
res = add(100, 300)
print(res.id)
# out: 'cb36c159-9202-4f24-b341-c387999d54cc
などとすると、 app(worker)側で、300と帰ってるのがわかる
[2018-08-30 10:17:59,850: INFO/ForkPoolWorker-1] Task tasks.add[cb36c159-9202-4f24-b341-c387999d54cc] succeeded in 0.00015129800158319995s: 400
#pool
返事が欲しい(....Celery need to store or send the states somewhere)
backendを設定する? redisでOKぽい。
Using Celery With Flask - miguelgrinberg.com
broker, backendを指定してるので、そういうことっぽい。flaskで。
あとは、celeryがちゃんと動き続ける安心感が欲しい。redisもそうだけど。
10秒くらいsleepさせる long_task_addを定義しておいて、celeryの workerを動作させて
code:python
from tasks import long_task_add
res = add(100, 300)
res.ready()
#out: False
#待つ
res.ready()
> True
#結果
res.result
#out: 400
# collect()で結果を回収もできる。 generatorが来る。複数の値をリクエストして、結果がでたものから?取れる?
# ここでは、ためしてない。。
x for x in res.collect()
> [(<AsyncResult: 418e09a3-6b04-4e1b-933c-cdac462a87c8>, 400)]
#要らないので、忘れる
res.forget()
res.ready()
#out: False
Using Celery With Flask - miguelgrinberg.com
brokerに投げてるので、別スレッドや別プロセスでも、idが分かれば問い合わせできる。(forget()されてなければ、たぶん)
issue
Support async keyword in python 3.7 · Issue #4500 · celery/celery
python3.7 だと、asyncは、キーワード
What’s New In Python 3.7 — Python 3.7.0 documentation
議論の雰囲気的には、2018年の終わり頃の version 4.3 での サポートぽい....
修正箇所自体は、
async.pyを、 asynchronous.pyにして、
redis.pyの中の asyncを asynchronous にすればOK. 3箇所。 rpc.pyもか。
dockerfiles/fix.sh at master · ddliu/dockerfiles
cerely としてしまう問題。 脳がカタカナしか受け付けないので、工夫したい。 セルuリ かな。