celery
tutorial
brokerを選ぶ
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
返事が欲しい(....Celery need to store or send the states somewhere)
backendを設定する? redisでOKぽい。
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()
res.ready()
> True
res.result
# collect()で結果を回収もできる。 generatorが来る。複数の値をリクエストして、結果がでたものから?取れる?
# ここでは、ためしてない。。
> [(<AsyncResult: 418e09a3-6b04-4e1b-933c-cdac462a87c8>, 400)]
res.forget()
res.ready()
brokerに投げてるので、別スレッドや別プロセスでも、idが分かれば問い合わせできる。(forget()されてなければ、たぶん)
issue
python3.7 だと、asyncは、キーワード
議論の雰囲気的には、2018年の終わり頃の version 4.3 での サポートぽい....
修正箇所自体は、
async.pyを、 asynchronous.pyにして、
redis.pyの中の asyncを asynchronous にすればOK. 3箇所。 rpc.pyもか。
cerely としてしまう問題。 脳がカタカナしか受け付けないので、工夫したい。 セルuリ かな。