前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django利用celery执行周期任务添加互斥锁

Django利用celery执行周期任务添加互斥锁

作者头像
IT不难
发布2023-11-17 13:45:38
2940
发布2023-11-17 13:45:38
举报
文章被收录于专栏:IT不难技术家园

前言

写了一个每三秒执行一次,有需要处理的数据则处理,没有则退出的函数。用celery周期性任务执行。遇到了一个问题就是,有数据处理时。3秒后,下一个进程会关掉此进程,加了一个锁。保证同一时间只有一个进程执行,其他进程直接退出。

实现代码

代码语言:javascript
复制
from celery import shared_task, current_task
@shared_task
def sync_start_process(sname):
    """
    异步执行任务
    """
    lock_name = f"lock_sync_start_process_{sname}"

    # 尝试获取锁定
    with current_task.app.Lock(lock_name, timeout=0):
        # 如果成功获取到锁定,则说明之前没有相同任务在执行,可以继续执行任务逻辑
        # 执行任务逻辑...
        process_start(sname)

    # 如果无法获取到锁定(即有相同任务正在执行),则会抛出 Reject 异常,任务会被自动丢弃
    raise Reject("Task is already in progress")

遇到问题

一开始调试成功了,后来遇到启动报错。死活找不到原因。

lk1xi67b.png
lk1xi67b.png

chatgpt提示4.0.0版本以上,Lock对象被移除了,更新代码。使用redis锁。

代码语言:javascript
复制
#操作docker
import redis
from celery import shared_task, current_task
from celery.exceptions import Reject

from .utils import process_start

#日志
from loguru import logger

@shared_task
def sync_start_process(sname):
    """
    异步执行任务
    """
    lock_name = f"lock_sync_start_process_{sname}"

    #创建redis链接
    r = redis.Redis(host='redis', port=6379, db=3, password='redis@2022')

    # 尝试获取锁定
    lock_acquired = r.set(lock_name, 'locked', nx=True, ex=1)

    if lock_acquired:
        try:
            # 如果成功获取到锁定,则说明之前没有相同任务在执行,可以继续执行任务逻辑
            # 执行任务逻辑...
            process_start(sname)
        finally:
            #释放锁
            r.delete(lock_name)
    else:
        # 如果无法获取到锁定(即有相同任务正在执行),则会抛出 Reject 异常,任务会被自动丢弃
        raise Reject("Task is already in progress")
lk1ypppy.png
lk1ypppy.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年07月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实现代码
  • 遇到问题
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档