[Django] celery的替代品 funboost
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Django] celery的替代品 funboost相关的知识,希望对你有一定的参考价值。
参考技术A Django开发web应用的过程中,一个老大难问题是异步调度问题。例如用户传来一个非常耗时的请求,这时候最好的处理方式是先把这个操作请求记录下来,先响应请求,等后面有空的时候再去计算,而不是让用户干等着着急。这种优化方式就是典型的生产者+消息队列+消费者设计模式,而Django框架本身并没有直接提供该设计模式的实现,大多教程都是利用第三方组件celery+redis来实现这个调度。
遗憾的是celery和redis官方都不支持windows,而我习惯的开发环境还是win10,所以需要找一个替代品。经过调研,发现了一个很好的【python分布式函数调度框架——funboost】. 它的优点很多,对Django开发来说,最大的亮点是完全无需启动第三方服务,即可实现生产消费设计模式。一个 pip install funboost 即可干活,开箱即用。它可以使用SQLite文件来做消息队列,足以应对小型应用开发。当然也可以使用Kafka这种高级的消息中间件,实现高可用。
要说缺点吧,这个组件的日志打印太啰嗦,而且没有提供关闭选项,控制台已被它刷屏。
安排常规活动:Cron/Cron 替代品(包括 Celery)
【中文标题】安排常规活动:Cron/Cron 替代品(包括 Celery)【英文标题】:Scheduling a regular event: Cron/Cron alternatives (including Celery) 【发布时间】:2011-09-10 20:36:42 【问题描述】:我感兴趣的事情是定期以固定的时间间隔运行一组特定的操作。显然这是cron的任务吧?
不幸的是,互联网似乎存在一些分歧。
让我详细说明一下我的设置。首先,我的开发环境在 Windows 中,而我的生产环境托管在 Webfaction (Linux) 上。 Windows 上没有真正的 cron,对吧?另外,我使用Django!对 Django 有什么建议?
Celery 当然!不幸的是,设置 Celery 对我来说或多或少是一场噩梦 - 请参阅 Error message 'No handlers could be found for logger “multiprocessing”' using Celery。这只是我在 Celery 上遇到的问题之一。其他包括一个套接字错误,我是唯一一个遇到这个问题的人。
别误会,Celery 看起来真的很酷。不幸的是,似乎缺乏支持,并且其首选后端 RabbitMQ 中内置了一些奇怪的限制。不幸的是,无论程序多么酷,如果它不起作用,那么它就不起作用!
这就是我希望你们所有人都能进来的地方。我想了解 cron 或 cron 等效项,它们可以在 Windows 和 Linux 环境中类似地(最好是相同地)设置。
(我已经与 Celery 苦苦挣扎了大约两个星期,不幸的是,我认为是时候认输并放弃它了,至少现在是这样。)
【问题讨论】:
为什么要在 Windows 上开发而在 Linux 上部署?看起来你正在为这些头疼的事情做好准备。 不完全是我的选择。我考虑过更换我的一台计算机或对其进行分区,但最终这有其自身的同等问题。只是想充分利用现在的情况。 Wubi 安装程序让你现在可以轻松双启动到 ubuntu。 对于仍在尝试原始初始方式的人,即设置 celery,请检查此 (aameer.github.io/celery-an-asynchronous-task-queue-job-queue) 和在 webfaction 上设置 rabbitmq,请检查此 (aameer.github.io/installing-rabbitmq-on-webfaction)。此外,如果您想对它们进行守护,请检查此 (aameer.github.io/circus-as-an-alternative-to-supervisor) 希望它对某人有所帮助。 【参考方案1】:一种简单的、非 Celery 的处理方法是创建 custom django-admin commands 来执行您的异步或计划任务。
然后,在 Windows 上,您可以使用at
命令来安排这些任务。在 Linux 上,您使用 cron
。
如果可以的话,我也强烈建议放弃 Windows 以用于开发环境。在 Linux 甚至 Mac OSX 上,你的生活会好很多。例如,使用 Ubuntu 重新利用备用或旧机器,或在 Windows 机器上的 VM 中运行 Ubuntu。
【讨论】:
【参考方案2】:我遇到了同样的问题,并没有尝试使用 celery(太复杂)或 cron(应用程序外部)来解决它,最终找到了 Advanced Python Scheduler。刚刚开始使用它,但它似乎相当成熟和稳定,有不错的文档,并且会采用多种调度格式(例如 cron 样式)。
从documentation,以特定间隔运行函数。
from apscheduler.scheduler import Scheduler
sched = Scheduler()
sched.start()
def hello_world():
print "hello world"
sched.add_interval_job(hello_world,seconds=10)
这是非阻塞的,我只需从我的urls.py
导入模块即可运行完全相同的东西。希望这会有所帮助。
【讨论】:
【参考方案3】:https://github.com/andybak/django-cron
由单个 cron 任务触发,但所有调度和配置均在 Python 中完成。
【讨论】:
【参考方案4】:Django Chronograph 是一个不错的选择。您只需要设置一个 cron,然后在 django admin 中执行所有操作。您可以从 django 管理中安排任务/命令。
【讨论】:
以上是关于[Django] celery的替代品 funboost的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django-Celery 重试任务 - Django/Celery