运维咖啡吧

享受技术带来的乐趣,体验生活给予的感动

django-celery-beat clocked使用UTC时区问题

这个问题坑了我一晚上没睡好,翻了大量文档/Github/源码,终于解决了,记录以下

问题描述

使用django_celery_beat做异步任务、定时任务和周期任务管理,异步任务、周期任务执行都正常,唯独定时任务会延迟8小时执行

经验告诉我们遇到延迟8小时的大概率是因为时区的问题,但翻遍了文档,时区相关的配置都已添加仍然没用

产生环境

# pip3 list | grep celery
celery                      5.2.7
django-celery-beat          2.2.1

实际上涉及到的版本较多,不止我这里这个版本会出现,我测试了其他一些版本也都有这个问题,官方没修复

解决方案

修改源码文件django_celery_beat/clockedschedule.py,以下这段

class clocked(schedules.BaseSchedule):
    """clocked schedule.

    Depends on PeriodicTask one_off=True
    """

    def __init__(self, clocked_time, nowfun=None, app=None):
        """Initialize clocked."""
        self.clocked_time = maybe_make_aware(clocked_time)
        super().__init__(nowfun=nowfun, app=app)

改为:

class clocked(schedules.BaseSchedule):
    """clocked schedule.

    Depends on PeriodicTask one_off=True
    """

    def __init__(self, clocked_time, nowfun=None, app=None):
        """Initialize clocked."""
        from .utils import make_aware
        self.clocked_time = make_aware(clocked_time)

        # self.clocked_time = maybe_make_aware(clocked_time)
        super().__init__(nowfun=nowfun, app=app)

问题即可解决