我们有一个基于Windows的Celery/RabbitMQ服务器,它在web应用程序进程外执行长时间运行的python任务。
例如,它的作用是获取一个CSV文件并处理每一行。对于每一行,它都会在我们的数据库中记录一个或多个记录。在
这似乎工作得很好,我可以看到记录被工人进程预订。但是,当我使用管理插件(基于web的管理工具)检查rabbitMQ服务器时,我看到排队的消息在增加,而没有返回。
在connections下,我看到116个连接,每个虚拟主机大约10-15个,都是“running”,但是当我点击时,大多数连接都是“idle”状态。 我也在想,为什么这些连接仍然是开放的,如果有什么我需要改变,让它们自己关闭:
在“队列”下,我可以看到6200多个状态为“空闲”且没有减少的项目。在
所以具体地说,我在问这些是否是正常的统计数据,或者我是否应该担心队列的增加,但不会返回,以及持续的连接似乎没有关闭。。。在
除了管理工具中相当简洁的帮助之外,我似乎找不到任何关于这些统计数据的含义以及它们是好是坏的信息。在
我还想知道为什么消息在队列中仍然可见,为什么它们没有被删除,因为任务似乎不能很好地完成。在
感谢任何帮助。在
如果你不需要可靠性,那么你可以让你的队列暂时。在
http://celery.readthedocs.org/en/latest/userguide/optimizing.html#optimizing-transient-queues
回答我自己的问题
Celery为调用代码中的每个任务发回一条结果消息。此消息通过同一AMPQ队列发回。 这就是为什么任务在工作,但队列一直在满。我们没有处理这些结果,甚至对它们不感兴趣。在
我将
ignore_result=True
添加到celery任务中,因此该任务不会将结果消息发送回队列。这是解决问题的主要办法。在此外,还添加了配置选项CELERY_SEND_EVENTS=False以加快CELERY的速度。如果设置为TRUE,则此选项使Celery发送外部监视工具的事件。在
除此之外,CELERY_TASK_RESULT_EXPIRES=3600现在确保即使返回结果,如果没有收到/确认,它们也会在一小时后过期。在
最后CELERY_RESULT_PERSISTENT设置为False,这将配置CELERY不在磁盘上存储这些结果消息。当服务器崩溃时,它们就会消失,这在我们的例子中很好,因为我们不使用它们。在
简言之,如果你不需要在你的应用程序中反馈任务是否完成以及何时完成,那么在celery任务上使用
ignore_result=True
,这样就不会发送任何消息。 如果您确实需要这些信息,请确保收集并处理结果,这样队列就不会填满。在相关问题 更多 >
编程相关推荐