首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消长期运行的任务-5.2.6

取消长期运行的任务-5.2.6
EN

Stack Overflow用户
提问于 2022-07-07 05:50:14
回答 1查看 292关注 0票数 0

我有一个项目托管在数字海洋的一个基本液滴与2GB拉姆。在我的本地机器中,长时间运行的任务运行在8-10分钟之间,而且仍然是数字海洋水滴中的successful.However,通常情况下芹菜在长期运行的任务中不会成功。

目前芹菜- celery 5.2.6我有两种配置在主管

  1. 运行芹菜工人celery -A myproject worker -l info
  2. 运行芹菜击败celery -A myproject beat -l info

这是来自celeryd.log的消息

CPendingDeprecationWarning:在芹菜5.1中,我们引入了一个可选的中断更改,在连接时,丢失取消了所有当前执行的任务,并且启用了延迟确认。当连接消失时,无法确认这些任务,并且任务将自动重新传递回队列。可以使用worker_cancel_long_running_tasks_on_connection_loss设置启用此行为。在芹菜5.1中,默认设置为False。在芹菜6.0中,默认情况下设置为True。

代码语言:javascript
复制
warnings.warn(CANCEL_TASKS_BY_DEFAULT, CPendingDeprecationWarning)

[2022-07-07 04:25:36,998: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
Trying again in 2.00 seconds... (1/100)

[2022-07-07 04:25:39,066: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
Trying again in 4.00 seconds... (2/100)

对于一个临时的解决方案,我所做的是重新启动服务器,并重新运行新的任务,但这不能保证长期运行的任务会成功,问题是以前失败的任务不会重新启动。

我的目标是

  1. 防止长期运行的任务被取消。
  2. 如果长期运行的任务已经被取消,并且无法避免取消,我需要它重新运行并继续,而不是开始一个新的任务。

这个是可能的吗?有什么办法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-11 20:17:25

正如警告消息中所述,您可以使用worker_cancel_long_running_tasks_on_connection_loss控制此行为,以防止在连接丢失时取消任务。在您的芹菜版本,它是默认关闭,所以您的任务不应该被取消。但是,即使延迟确认任务在此场景中成功完成,任务仍然被重新传递到队列并将再次运行--不管这种设置如何发生,对于延迟确认的任务来说,这是不可避免的。

这就是为什么您必须将任务设计为幂等的原因。

如果您的工作不是幂等的,另一种解决方案是让您的任务提前关闭(默认情况下),但这可能会导致您在任务未实际完成的情况下放弃任务。

如果必须避免删除任务,则必须将acks_late=True设置为任务,并且必须将其设计为幂等函数。这是必要的,无论具体的连接丢失问题,因为许多其他事情可能发生中断您的任务,并产生同样的情况。

我需要它重新运行并继续,而不是开始一个新的任务。

这取决于你如何设计你的任务的幂等性。例如,您可能希望让作业跟踪其在持久存储中的进度,因此当任务失败并再次运行时,它可以确定如何进行最佳恢复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72892842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档