带 self
的任务写法 (bind=True
)
这种写法允许任务访问到任务实例本身的属性和方法,通常用于需要在任务执行过程中更新任务状态或访问任务元数据(如任务ID)的场景。
from celery import shared_task
@shared_task(bind=True)
def perform_lstm_task(self, algorithm_id):
# 这里的 self 是任务实例,可以访问任务的状态、任务ID等属性
task_id = self.request.id
# 可以手动更新任务状态
self.update_state(state='PROGRESS', meta={'progress': 50})
# 执行实际的 LSTM 任务逻辑
result = perform_lstm_algorithm(algorithm_id)
# 返回结果
return result
def perform_lstm_algorithm(algorithm_id):
# 实际的 LSTM 计算逻辑
return {"status": "completed"}
特点:
self
代表任务实例,可以通过self.request
访问任务元数据,例如任务ID。- 可以使用
self.update_state
手动更新任务的状态和元数据。 - 适合在任务过程中需要反馈进度或访问任务状态的场景。
不带 self
的任务写法 (bind=False
,默认行为)
这种写法更简单,适合不需要访问任务实例属性,只需执行某项具体任务的场景。
from celery import shared_task
@shared_task
def perform_lstm_task(algorithm_id):
# 执行实际的 LSTM 任务逻辑
result = perform_lstm_algorithm(algorithm_id)
# 返回结果
return result
def perform_lstm_algorithm(algorithm_id):
# 实际的 LSTM 计算逻辑
return {"status": "completed"}
特点:
- 函数没有
self
参数,因此无法访问任务实例的状态或元数据。 - 适合不需要反馈进度或手动更新状态的简单任务。
- 更简洁,但功能上没有
bind=True
的写法灵活。
总结
- 带
self
的写法 (bind=True
):适用于需要在任务执行过程中不断更新状态、报告进度、或者访问任务ID等元数据的场景。 - 不带
self
的写法 (bind=False
):适用于简单的任务,只需要执行逻辑,不需要与任务元数据交互。
选择哪种写法取决于任务的复杂性和需求。如果需要更复杂的控制和反馈机制,建议使用 bind=True
的写法。如果只是执行一个简单的任务,那么默认的 bind=False
会更合适。