在指定时间安排单个任务的最佳方法是什么?

2024-10-02 18:14:38 发布

您现在位置:Python中文网/ 问答频道 /正文

以下面的例子为例:

我们有用户要求在2011-04-19 20:20发布id:5的文章 所以我想创建一个任务,在2011-04-19 20:20更改文章的状态。在

我想出了以下想法:

  1. 实现芹菜并使用RabbitQM或Django kombu:使用倒计时和eta:http://docs.celeryproject.org/en/v2.2.5/userguide/executing.html#eta-and-countdown
  2. 创建一个django管理任务,该任务将检查是否需要发布文章。使用cron作业每分钟运行一次此任务。在
  3. 创建一个小的python应用程序,该应用程序每隔一秒或每10秒检查一次for循环。我会把当前10分钟内的所有文章放在内存中做更快的检查,如果没有的话它会休眠10分钟。在

在这种情况下你有什么建议?什么是性能和扩展的最佳选择。假设每秒大约执行10万个任务。在


Tags: django用户id应用程序httpdocs状态文章
3条回答

为什么不给一个datetime活动字段,默认情况下是now()方法?然后为这个模型创建一个只返回活动任务的管理器,该任务的活动日期将比现在短(例如,get_active only)。 当您希望文章在将来显示时,只需使用将来的活动值保存一个对象。 这样你将只搜索活跃的文章,跳过所有的升级文章。在

我的建议是保持启动的简单性,每分钟都使用CRON启动的管理命令,当这超出您的需要时,请切换到分布式作业方法。如果您正确地分离了代码,这应该不会有太大的变化。在

如果您从一开始就要执行10万个任务,我会选择选项1,因为您可以使用celery将负载分配到多个服务器上。如果选择一个普通的cronjob设置,则需要在同一个服务器上运行所有任务,这并不能很好地扩展。设置RabbitMQ并对其进行维护比设置cronjob要复杂得多,所以尽可能推迟。在

对于选项2:Django扩展还有一个类似cronjob的系统,作为管理命令实现,因此您不必重新设计轮子,而且Django扩展还有许多其他很好的工具,您可能无论如何都想使用这些工具。在

http://packages.python.org/django-extensions/jobs_scheduling.html

如果使用#3,请确保使用某种方法来保持守护进程的运行,如果它崩溃,则需要自动启动它的备份。http://supervisord.org是个不错的选择。在

我绝对会建议你做一份这样的工作。如果不想处理系统互操作,可以使用类似django-cron的方法。在

相关问题 更多 >