celery.shared_task()でタスクを作成するときに`bind=True`を指定すると、第一引数がそのタスクオブジェクトになります。
from celery import Celery, shared_task
app = Celery('tasks', broker='redis://127.0.0.1:6379/')
@shared_task(bind=True, default_retry_delay=1, max_retries=3)
def add(self, x, y):
print(x, y)
return x + y
res = add.delay(1, 3)
print(res.wait())
ステータスをfailureにしたり、リトライを指定する場合、タスク関数自身(実際は関数ではなくて呼び出し可能オブジェクトですが)にその処理を指定する必要がありましたが、見た目上それは関数なので非常に不自然なコードになっていました。
bind=Trueを使うとselfに対してステータスの変更やリトライを指定できるのでより自然なコードになります。ただし関数呼び出しする場合にはそのtask object相当のものを渡す必要があります。