芹菜任务消失

Posted

技术标签:

【中文标题】芹菜任务消失【英文标题】:Celery tasks disappear 【发布时间】:2014-04-16 18:33:35 【问题描述】:

我有一个使用 cron 脚本运行的 django 项目,执行管理命令。此命令为 celery 创建循环任务:

for r in pr:
    log_task(tasks_logger.info, "to_queue", r)
    remind.delay(r, now, send_all)

任务看起来像这样:

class RTask(Task):
    abstract = True
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        r = args[0]
        log_task(logger.error, exc, r)
        log_task(logger_tb.error, einfo, r)


@task(base=RTask)
def remind(r, now, send_all):
    log_task(logger.info, "from_queue", r)
    ....

如您所见,我在任务执行之前和其中的第一行有一个记录器。问题是 - 在项目代码更新后(另一个程序员添加了其他任务和 celery 版本更新)我的大部分任务开始消失。我的日志文件如下所示(仅执行了 8-10 个任务中的 1 个):

[2014-03-12 12:45:08,806]  106152122   INFO    to_queue
[2014-03-12 12:45:08,819]  106138932   INFO    to_queue
[2014-03-12 12:45:08,915]  106121944   INFO    to_queue
[2014-03-12 12:45:08,916]  110418819   INFO    from_queue
[2014-03-12 12:45:08,922]  106075777   INFO    to_queue

celery 日志文件不包含任何有用的信息。兔子也一样。 它有很多这样的东西,但它与我的任务无关,或者是吗?

[2014-03-12 12:58:43,091: INFO/MainProcess] Got task from broker: celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] eta:[2014-03-12 12:58:44.089401+00:00]
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] retry: Retry in 1s
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7b1d4a6b-9a34-43e9-98c9-851c93ace5ce] retry: Retry in 1s

可能是什么问题? 如何跟踪任务以了解它何时消失?

请帮忙=)

【问题讨论】:

您是否尝试过将日志级别设置为 DEBUG 而不是 INFO? >> 您是否尝试过将日志级别设置为 DEBUG 而不是 INFO?没有其他信息 =( 如果没有详细信息,很难判断您的问题是什么。首先尝试rabbitmqctl list_queues 或者如果您使用虚拟主机:rabbitmqctl list_queues -p <vhost> 并看到这些任务确实存储在 RabbitMQ 中。如果没有,请仔细检查您的配置文件。请注意,如果您使用 django_celery,则需要将其添加到设置中:import djcelery; djcelery.setup_loader()。顺便说一句:如果您有多个工作人员并且正在登录到同一个文件,那么您可能会遇到文件锁定问题,因为某些工作人员会覆盖其他人的行。 【参考方案1】:

您可能有 celery 进程在后台运行,之前的启动没有正确关闭,这可能正在消耗消息。尝试通过运行查看您是否有这样的工人

ps aux | grep celery

在命令行中。以下命令将自动为您杀死所有此类孤儿芹菜工人:

ps aux | grep celery | awk 'system("kill -9 " $2)'

我在启动我的应用程序之前执行它

【讨论】:

【参考方案2】:

这是我的问题的原因:http://docs.python.org/2/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes 尽管日志记录是线程安全的,并且支持在单个进程中从多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以在多个进程中序列化对单个文件的访问Python 中的进程。如果您需要从多个进程记录到单个文件,一种方法是让所有进程记录到 SocketHandler,并有一个单独的进程实现从套接字读取并记录到文件的套接字服务器。 (如果您愿意,您可以在现有进程之一中指定一个线程来执行此功能。)本节更详细地记录了这种方法,并包括一个工作套接字接收器,它可以用作您在您的自己的应用程序。http://docs.python.org/2/howto/logging-cookbook.html#sending-and-receiving-logging-events-across-a-network 当负载很小时,一切正常,但随着负载的增加,我遇到了问题。

【讨论】:

以上是关于芹菜任务消失的主要内容,如果未能解决你的问题,请参考以下文章

为啥创建了芹菜任务但未收到

Celery---一个懂得异步任务,延时任务,周期任务的芹菜

芹菜任务不会在 django 中执行

Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜

Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜

Python Celery - 如何在其他任务中调用芹菜任务