Python中的任务队列处理
任务是:
我在数据库里有一个任务队列,这个队列在不断增加。当我有资源的时候,我需要用Python脚本来处理这些任务。我想到两种方法:
让Python脚本一直运行着。但我不太喜欢这样(可能会导致内存泄漏)。
通过定时任务(cron)来调用Python脚本,让它处理一小部分任务。但我需要解决一个问题,就是要确保内存中只有一个正在运行的脚本(以防同时有多个脚本在运行)。那么,怎样在Python中实现这个最佳方案呢?
有没有什么想法可以解决这个问题呢?
3 个回答
我建议你使用Celery,这是一种异步任务队列系统,我自己也在用。
虽然它可能对你的需求来说有点复杂,但如果将来需要的话,可以很方便地通过增加更多的工作资源来扩展。
这个问题有点模糊。你需要记住的一点是,在Python中内存泄漏是很难发生的,因为有自动的垃圾回收机制。用cron
定时运行一个Python脚本来处理队列并不是个好主意,虽然这样做也能正常工作。
我建议使用第一种方法;如果你需要更强大的功能,可以创建一个小的Python进程来监控数据库队列,并启动新的进程来处理任务。
你可以使用锁文件来防止多个脚本同时从定时任务(cron)中运行。可以参考之前一个问题的回答,"Python: 创建基于PID的锁文件的模块"。其实,这对于任何需要确保不会有多个实例同时运行的情况来说,都是一种很好的做法。所以即使你的脚本是一直在运行的,我还是建议你了解一下这个方法。
对于大多数情况,避免内存泄漏并不太难,但如果你遇到很多麻烦(比如我在使用一些复杂的第三方网络框架时有时会遇到),我建议你可以写一个小而精心设计的主循环,来监控数据库中的新任务,然后使用multiprocessing模块来分叉出新进程来完成每个任务。
当一个任务完成后,子进程可以退出,这样可以立即释放那些没有被正确回收的内存,而主循环应该足够简单,这样你就可以避免任何内存泄漏。
这样做还有一个好处,就是如果你的系统有多个CPU核心,或者你的任务在等待输入输出时花费了很多时间,你可以并行运行多个任务。