python中的任务队列过程

Posted

技术标签:

【中文标题】python中的任务队列过程【英文标题】:Tasks queue process in python 【发布时间】:2011-03-27 05:23:30 【问题描述】:

任务是: 我将任务队列存储在数据库中。它长大了。当我有资源时,我需要通过 python 脚本解决任务。我看到了两种方式:

    python 脚本一直在工作。但我不喜欢它(原因可能是内存泄漏)。

    由 cron 调用的 python 脚本并执行一小部分任务。但我需要解决内存中一个工作活动脚本的问题(以防止活动脚本计数增长)。在python中实现它的最佳解决方案是什么?

有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

这是一个有点模糊的问题。您应该记住的一件事是,由于自动垃圾收集,在 Python 中泄漏内存非常困难。 cron使用 Python 脚本来处理队列不是很好,尽管它可以正常工作。

我会使用方法 1;如果您需要更多功能,您可以创建一个小型 Python 进程来监视数据库队列并启动新进程来处理任务。

【讨论】:

您可以泄漏资源(忘记关闭在全局命名空间等中打开的文件),但内存并没有真正泄漏。循环引用不会尽快收集,但也会收集。当然,除非其中有错误。 确实如此。在全局命名空间中打开文件只是 icky :p.【参考方案2】:

您可以使用锁定文件来防止多个脚本用尽 cron。请参阅前面问题“Python: module for creating PID-based lockfile”的答案。对于您需要确保实际上不会运行多个实例的任何事情,这实际上只是一个很好的做法,所以即使您确实让脚本不断运行,您也应该研究它,我这样做 em> 建议。

对于大多数的事情,避免内存泄漏应该不会太难,但如果你遇到很多麻烦(我有时会使用复杂的第三方网络框架,例如),我建议改为使用精心设计的小型主循环编写脚本,该循环监视数据库中的新作业,然后使用multiprocessing module 派生新进程以完成每个任务。

当一个任务完成时,子进程可以退出,立即释放所有没有被正确垃圾回收的内存,并且主循环应该足够简单,以避免任何内存泄漏。

如果您的系统有多个 CPU 内核,或者如果您的任务花费大量时间等待 I/O,这还提供了一个优势,即您可以并行运行多个任务。

【讨论】:

【参考方案3】:

我建议使用Celery,这是一个我自己使用的异步任务排队系统。

这对于您的用例来说可能看起来有点繁重,但如果/在需要时添加更多工作器资源,它可以很容易地在以后扩展。

【讨论】:

以上是关于python中的任务队列过程的主要内容,如果未能解决你的问题,请参考以下文章

检索芹菜队列中的任务列表

获取 Google App Engine 任务队列中的任务

详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务

关于消息队列速率的解决方案

分布式任务队列Celery入门与进阶

异步任务队列Celery在Django中的使用