基於以下示例:芹菜4.0.0和基於任務的任務工作流程
http://shulhi.com/class-based-celery-task/;
https://blog.balthazar-rouberol.com/celery-best-practices
http://shulhi.com/class-based-celery-task/
Class based Task in django celery
我想創建類似的東西:
class CalculationWorker(Task):
def __init__(self, id_user):
self._id_user = id_user
self._user = get_object_or_404(User, pk=self._id_user)
# I need to understand if the bind work or if it's needed
def _bind(self, app):
return super(self.__class__, self).bind(celery_app)
def _retrieve_some_task(self):
# long calculation
def _long_run_task(self):
# long calculation
self._retrieve_some_task()
# Main entry
def run(self):
self._long_run_task()
#
def run_job():
worker = CalculationWorker(id_user=323232)
task = worker.apply_async()
的文件似乎說這是可能的(反正這是我不清楚)http://docs.celeryproject.org/en/latest/userguide/tasks.html#custom-task-classes 。它甚至說:
「」」 這意味着初始化構造僅會被每個進程調用,該任務類在語義上更接近演員 。‘’
但http://docs.celeryproject.org/en/latest/whatsnew-4.0.html#the-task-base-class-no-longer-automatically-register-tasks顯式說:「最好的做法是使用自定義任務類只用於覆蓋一般行爲,然後使用任務裝飾來實現任務」
至於結果,我得到了一個NotRegistered例外由於這種https://github.com/celery/celery/issues/3548,但加入app.tasks.register(CalculationWorker())
沒解決不了。 我正在使用Django 1.10.X和芹菜4.0.0
這種方法仍然有效嗎?
感謝