首页 > 编程问答 >为什么 celery 击败调度程序在 django celery 过期后仍在运行

为什么 celery 击败调度程序在 django celery 过期后仍在运行

时间:2024-07-22 15:19:35浏览次数:7  
标签:python django celery

PeriodicTask.objects.create(
                    interval=interval,
                    crontab=crontab,
                    clocked=clocked, 
                    name=data["name"],
                    task=data["task"], # dropdown
                    args=json.dumps(json.loads(data["args"])),
                    one_off=True if schedule_type == "clocked" else False,
                    expires=datetime.strptime(data["expires"], '%Y-%m-%d %H:%M:%S.%f') if data["expires"] else None
                   
                )

-它在设置过期时间后仍在运行

-它不调用函数,但它命中worker

例如:在worker终端

[2024-07-22 07:06:16,334: INFO/MainProcess] Task test[390404a1-9814-4208-85a2-6e1269bc09d9] received
[2024-07-22 07:06:16,334: INFO/MainProcess] Discarding revoked task: test[390404a1-9814-4208-85a2-6e1269bc09d9]

和celerybeat终端中

[2024-07-22 07:06:16,327: WARNING/MainProcess] 390404a1-9814-4208-85a2-6e1269bc09d9 has an expiration date in the past (16.325898s ago).
We assume this is intended and so we have set the expiration date to 0 instead.
According to RabbitMQ's documentation:
"Setting the TTL to 0 causes messages to be expired upon reaching a queue unless they can be delivered to a consumer immediately."
If this was unintended, please check the code which published this task.```

代码片段显示你正在使用 Celery 的定期任务,并为其设置了过期时间( expires 参数)。然而,你观察到即使任务过期了,它仍然在 Celery Beat 和 Celery Worker 之间传递,尽管它没有真正执行。

出现这种情况可能有以下几个原因:

1. 过期时间设置不正确:

  • 时区问题: 确保 expires 参数中使用的时间与 Celery Beat 和 Celery Worker 使用的时区一致。如果时区不一致,过期时间可能会被错误地解释。
  • 时间格式问题: 确保 expires 参数使用的是 Celery 能够正确解析的时间格式。根据你的代码,你使用的是 '%Y-%m-%d %H:%M:%S.%f' ,这应该是正确的格式。
  • 过期时间已过: 检查你设置的过期时间是否已经过去。如果过期时间在任务创建之前,Celery 会将其视为无效的过期时间。

2. RabbitMQ 消息队列的行为:

  • 消息持久化: Celery 默认使用持久化的消息队列,这意味着即使 Celery 停止运行,消息也会被保存在队列中。如果你的任务在过期之前没有被消费,它可能会在 Celery 重新启动后再次被调度。
  • 消息 TTL: Celery Beat 会根据任务的过期时间设置消息的 TTL(Time-to-Live)。然而,RabbitMQ 的默认行为是只有当消息到达队列头部时才会检查 TTL。如果队列中有其他消息,即使过期,你的任务也可能需要等待一段时间才会被丢弃。

3. Celery 配置问题:

  • CELERY_TIMEZONE: 确保 Celery 的时区设置正确,与你的应用程序和数据库一致。
  • CELERY_ENABLE_UTC: 如果你使用的是 UTC 时间,请确保 CELERY_ENABLE_UTC 设置为 True

解决方法:

  1. 检查并更正过期时间: 确保 expires 参数使用正确的时间、时区和格式。
  2. 配置 RabbitMQ: 可以考虑配置 RabbitMQ 以使用非持久化队列或调整消息 TTL。但要注意,这可能会影响其他 Celery 任务。
  3. 使用 revoke() 方法: 如果需要立即停止一个定期任务,可以使用 revoke() 方法。例如: ```python from celery.task.control import revoke

revoke(task_id, terminate=True) ``` 4. 升级 Celery 版本: 一些旧版本的 Celery 可能存在与过期时间处理相关的 bug。尝试升级到最新版本。

代码改进建议:

  • 使用时区感知的 datetime 对象: 为了避免时区问题,建议使用时区感知的 datetime 对象。可以使用 pytz 库来创建时区感知的对象。
  • 记录日志: 在你的任务代码中添加日志记录,以便更好地了解任务执行和过期时间处理的过程。

通过仔细检查代码、配置和 Celery 的行为,你应该能够找到导致问题的原因并解决它。

标签:python,django,celery
From: 78777365

相关文章

  • Python 实现Excel和TXT文本格式之间的相互转换
    Excel是一种具有强大的数据处理和图表制作功能的电子表格文件,而TXT则是一种简单通用、易于编辑的纯文本文件。将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存,方便其他程序读取和处理。而将TXT转换为Excel则可以将文本文件中的数据导入到Excel中进行进一步的分析和......
  • Python (Django) 数据操作
    “如何将Excel考勤数据转换为特定的数据库插入格式?”**我Excel中的数据如下所示:**这是数据格式I**需要将其转换为适合数据库插入的格式,如下所示:**我想要的数据将Excel考勤数据转换为特定数据库插入格式的Python......
  • 在 python 中表示矩阵等价类的好方法是什么?
    我正在尝试编写一个程序来对井字棋进行强化学习。我希望引擎认识到,如果您反射棋盘或旋转它,您会得到完全相同的游戏,因此这些棋盘应该被视为彼此相同。目前我有一本字典,代表我当前对每个棋盘的估计估值游戏中的棋盘,每次游戏结束时,该游戏期间发生的所有棋盘位置的估值都会根据它......
  • MIT自学---python---6.100A_lecture2
    MIT自学---python---6.100A_lecture2前言一、设置python编译器地址二、将运行python文件的命令简化三、终端尝试执行简单python命令四、今日学到的python命令个人总结前言  这两天去听讲座,没什么时间按照计划自学MIT,今天赶紧补上。今天主要任务是搭建vscodepython......
  • python pip 需要构建工具,而它已经安装
    我看到这个问题已经被发布了很多次,人们设法解决了这个问题,但我没有!!操作系统版本:Windows1021H1Build19043.1288Python版本:Python3.9.7(tags/v3.9.7:1016ef3,Aug302021,20:19:38)[MSCv.192964bit(AMD64)]onwin32Pip、wheel和setuptool都可以日期:......
  • 无法在浏览器中访问Python 127.0.0.1:8000上的本地主机
    fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('products/'),include('products.urls')#thisline]嗨,任何人。很抱歉问这样的问题,但这是我第一次尝试python。......
  • 在 VSCode 中通过 Python 使用 YouTube API 时如何启用 Intellisense
    我想在使用GoogleYouTubeAPI和Python时在VSCode中获得IntelliSense。但我不知道详细步骤。fromgoogleapiclient.discoveryimportbuildapi_key="****"youtube=build("youtube","v3",developerKey=api_key)request=youtube.channels().list(part......
  • 当 python 脚本通过 jenkins + Github 在 Windows 本地计算机上运行时,chrome 浏览器不
    我的Python代码是(windowsMachine)fromseleniumimportwebdriverprint("newLine")print("2Line")print("3Line")holdChrome=webdriver.ChromeOptions()holdChrome.add_experimental_option("detach",True)#Restricta......
  • python_基础_数据类型
    基础数据类型不需要声明,只有被赋值后才会创建变量。变量本身没有类型,“类型”指的是所存值的类型。类型判断type(x)和isinstance(x,int)前者不会认为子类是一种他的父类类型后者会认为子类是父类类型>>>classA:...pass...>>>classB(A):...pass......
  • IPython 使用技巧
    IPython是一个强大的交互式Pythonshell,提供了许多方便的功能,使Python编程更加高效和愉快。本文将介绍一些IPython的实用技巧,帮助开发者充分利用其功能,提高编程效率。1.基本操作和快捷键1.1启动IPython可以通过在终端输入以下命令来启动IPython:ipython启动后,你......