Jadi sepertinya saya perlu mengakses AsyncResult
hanya melalui instance aplikasi Celery saya, bukan melalui Celery, atau meneruskan instance aplikasi Celery sebagai argumen.
Jadi, ini tidak berhasil:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Ini berfungsi:
from app import my_celery # Your own Celery Application Instance
@app.route('/status/<task_id>')
def get_status(task_id):
task = my_celery.AsyncResult(task_id)
return task.state
Ini juga berfungsi:
from app import my_celery
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id, app=my_celery)
return task.state
Saya menduga apa yang terjadi adalah dengan memanggil AsyncResult
langsung dari Celery, ia tidak mengakses konfigurasi Celery, oleh karena itu dianggap tidak ada backend yang dikonfigurasi untuk hasil kueri.
Tapi itu hanya akan menjelaskan kegagalan fungsi sepenuhnya, dan bukan perilaku yang tidak menentu. Saya menduga ini karena utas yang berbeda, dan situasi di mana instance aplikasi menjadi penting, jadi Celery menemukannya, meskipun tidak terlalu yakin.
Saya telah menjalankan beberapa tes dan tampaknya berfungsi dengan baik lagi setelah mengubah AsyncResult
yang diimpor , tapi saya akan terus menggali.