Celery任务消失

9

我有一个正在运行的Django项目,其中包含cron脚本,执行管理命令。该命令在for循环中为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个任务中的一个被执行):

[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日志文件中没有任何有用的信息。RabbitMQ也是如此。

它有很多这样的东西,但与我的任务无关,或者说它与我的任务有关吗?

[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了吗? - olofom
你尝试将日志级别设置为DEBUG,而不是INFO了吗? - shaihulud
没有详细信息很难确定你的问题所在,建议尝试先执行 rabbitmqctl list_queues 命令,或者如果你使用了vhost,则执行 rabbitmqctl list_queues -p <vhost> 命令,查看这些任务是否真正存储在RabbitMQ中。如果不存在,请再次检查你的配置文件。请注意,如果你使用django_celery,则需要将以下内容添加到设置中:import djcelery; djcelery.setup_loader()。另外,如果你有多个工作进程并且将日志记录到同一个文件中,则可能会出现文件锁定问题,导致某些工人覆盖其他工人的行。 - seeg
2个回答

6

有可能您的后台正在运行 celery 进程,这些进程是之前启动但没有正确关闭的遗留物,可能会消耗消息。尝试在命令行中运行以下命令查看是否有此类进程:

ps aux | grep celery

以下命令将自动为您杀死所有这样的孤立 celery 工作进程:

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

我在启动应用程序之前执行此操作。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接