当前位置: 首页 > 面试题库 >

Celery反复运行长时间运行的已完成任务

范俊逸
2023-03-14
问题内容

我有一个python celery-redis队列处理一次上传和下载值得一次演出和大量演出的数据。

很少有上传内容需要花费几个小时的时间。但是,一旦完成了这样的任务,我就目睹了这种奇怪的芹菜行为:芹菜调度程序通过将其再次发送给工作人员来重新运行刚刚完成的任务(我正在运行一个工作人员),并且它在同一时间发生了2次任务!

有人可以帮助我知道为什么会发生这种情况以及如何预防吗?

这些任务肯定干净地完成了,没有错误报告,因为这些任务运行时间非常长。


问题答案:

我最近遇到了这个问题,最终发现由于任务预取和任务超出
可见性超时的结合,任务正在多次运行 。任务将在执行之前被确认(除非您设置ACKS_LATE =
True),并且默认情况下每个进程会预取4个任务。第一个任务将在执行之前得到确认,但是如果执行需要一个多小时,则其他预提取的任务将被交付给另一个工作程序,在该工作程序中,它会被执行另外的时间(或者在您的情况下,由同一人执行另外的时间)工人)。

您可以通过将可见性超时时间增加到比任务的最长运行时间更长的时间来解决:

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600*10}  # 10 hours

您还可以设置PREFETCH_MULTIPLIER=1为禁用预取,以便长时间运行的任务不会阻止其他任务被确认。



 类似资料:
  • 问题内容: 问题 我已经将一个长期运行的任务划分为多个逻辑子任务,因此我可以在每个子任务完成时报告结果。但是,我正在尝试报告将永远无法完成的任务的结果(而不是不断产生价值),并且正在使用现有的解决方案来做到这一点。 背景 我正在为我编写的某些Python程序构建Web界面。用户可以通过Web表单提交作业,然后返回查看该作业的进度。 假设我有两个函数,每个函数都可以通过单独的形式进行访问: :执行大

  • 我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,

  • 问题内容: 我使用celery更新新闻聚合站点中的RSS feed。我为每个提要使用一个@task,看起来一切正常。 有一个细节我不确定如何处理:所有提要每分钟都使用@periodic_task更新一次,但是如果提要仍在启动新任务时从上一个定期任务更新,该怎么办?(例如,如果Feed确实很慢或离线,并且任务在重试循环中进行) 目前,我存储任务结果并按以下方式检查其状态: 也许我错过了一些使用芹菜机

  • 问题内容: 最近,我得到了这种警告,这是我第一次得到警告: 我正在做一个小组项目,我不知道这是从哪里来的。这从来没有发生过。突然,当其他人参与该项目时出现。我如何找到导致此警告的文件/功能?我一直在寻找答案,但主要是关于如何解决的解决方案。如果我什至找不到问题的根源,我将无法解决。 在这种情况下,警告仅在Chrome上显示。我尝试使用Edge,但没有收到任何类似的警告,并且尚未在Firefox上对

  • 我正在尝试将一个向服务器发送消息的异步任务迁移到RxJava。该任务大致执行以下操作: 1) 创建将要发送的消息(保存到数据库) 2)向用户显示消息(状态为“发送”) 3)将消息发送到服务器(下面的代码段) 4)将消息标记为已发送或失败(保存到数据库) 5)更新UI 我创建了所需的Rx链,部分如下所示: 当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposa

  • 问题内容: 我的应用程序运行一些数据库查询,这可能需要很长时间。 在执行这些查询时,我的应用程序似乎死机了,看起来该应用程序已停止工作。 我需要使用progressbar来避免此问题,但是我不确定如何预测查询执行所花费的时间。 运行查询的代码如下 如何显示进度条以显示查询的进度? 问题答案: 您可以用来解决这类问题。 首先定义一个类的全局变量, 例如 然后在执行查询(如事件或其他任何内容)的过程中