celery+redis超长任务重复执行
时间: 2023-08-03 12:04:37 浏览: 210
在使用 Celery 和 Redis 时,长时间运行的任务可能会导致任务重复执行。为了避免这种情况,你可以在任务函数中添加一个标识符来检查任务是否已经被处理,例如:
```python
from celery import Celery
from celery.utils.log import get_task_logger
import time
import redis
app = Celery('tasks', broker='redis://localhost:6379/0')
logger = get_task_logger(__name__)
redis_conn = redis.Redis(host='localhost', port=6379, db=0)
@app.task
def long_running_task():
task_id = 'long_running_task'
if not redis_conn.get(task_id):
# 执行任务
logger.info('Task started')
time.sleep(30)
logger.info('Task completed')
redis_conn.set(task_id, '1', ex=3600) # 设置锁定标识符,并设置过期时间为一小时
else:
logger.info('Task already running')
```
在上面的例子中,我们使用 Redis 来存储任务是否被锁定的标识符。如果任务没有被锁定,则执行任务,并在任务完成后将任务锁定。如果任务已经被锁定,则不会执行任务并打印一条消息。
注意,使用 Redis 存储锁定标识符可以在多个 Celery worker 之间共享状态。此外,为了避免死锁情况的发生,建议设置锁定标识符的过期时间。
阅读全文