【问题标题】:Difference between usage of Django celery and Django cron-jobs?Django celery 和 Django cron-jobs 的用法有什么区别?
【发布时间】:2020-03-21 23:32:05
【问题描述】:

很抱歉,如果它是基础知识,但我在互联网上没有找到任何比较这两种技术的答案。我应该如何决定何时使用哪一个,因为两者都可以用来安排和处理周期性任务。

这是一篇文章所说的:

Django 芹菜:

作业是任何应用程序的重要组成部分 在后台为您进行一些处理。如果你的工作是实时的 可以使用django应用celery。

Django-cronjobs:

django-cronjobs 可用于调度periodic_task,这是一个 有效的工作。 django-cronjobs 是一个简单的 Django 应用程序,可以注册运行 通过管理命令 cron 作业。

谁能解释一下我应该何时选择哪个和为什么?我还需要知道为什么在分布式计算时使用 celery 以及为什么不使用 cron 作业

【问题讨论】:

    标签: django cron celery django-celery django-cron


    【解决方案1】:

    这两个东西可以用于同一个目标(后台执行)。但是,如果您要明智地选择,您应该真正了解它们实际上是完全不同的东西

    这是我希望有人在我还是菜鸟时告诉我的(而不是我今天达到的新手级别:))。

    cron

    cron 作业 的概念是我们希望命令/进程按某个时间表执行。此外,我们希望该进程接收 x,y,z 参数,使用 a,b,c 环境变量运行,用户 id 为 123。

    一些 cron 系统可能会促进一些额外的功能,例如:

    • 赶上错过的任务(例如,服务器因断电整夜关闭,一旦我们打开它,它就会运行我们通常每小时运行的命令的 8 个实例)。
    • 可能会帮助您处理通常使用 pid 文件执行的锁定类型,以避免并行运行相同的命令。

    在大多数情况下,cron 系统是愚蠢的:“此时只需运行此命令,谢谢!”。

    芹菜

    Celery 的概念要复杂得多。它适用于任务、任务链和和弦、错误处理以及(在大多数情况下)工作结果的收集。它有一个工作队列(或许多队列)和一个工作人员(或许多)。当一个任务(实际上只是描述请求工作的消息)进入队列时,它会在那里等待,直到有工作人员可以处理它。就像 DMV 的 1 名或多名员工为满屋等候的顾客提供服务一样。

    此外,Celery 可以促进分布式工作。这有点像(如果我可以稍微折磨一下这个类比)——DMV 办公室之间的区别,每个员工共享相同的电话、计算机、复印机等,而 DMV 的员工拥有专用资源并且永远不会被其他员工阻止。

    用于网络应用的 Celery

    在 Web 应用程序中,当一些 Web 访问导致要做的事情应该在与 Web 浏览器的对话之外处理时,通常会使用 Celery。例如:

    • 网络用户刚刚做了一些应该导致发送电子邮件的事情。为了发送电子邮件,您的网络服务器需要联系邮件服务器。这可能需要一些时间,服务器可能很忙,等等——我们不能让网络用户只是等待,在我们这样做的时候在他们的浏览器上什么也看不到。嗯,你可以,但它不会可靠地工作。因此,我们将电子邮件发送作为队列中的一项工作。这样,它可以“随时”发生,并且网络服务器可以重新与浏览器通信。

    • 用户刚刚提交了一张信用卡作为付款。您将需要联系卡处理器,但这可能需要几秒钟。您甚至可能需要多次联系他们(例如,他们现在真的很忙)。同样,您不希望用户的 Web 浏览器只是呆在原地不动,也不希望 Web 服务器进程或执行线程被捆绑。相反,您使用 Celery 创建作业,告诉浏览器在几秒钟后检查(或使用“网络套接字”),然后您的网络服务器继续运行并与其他网络用户对话。当浏览器稍后返回时,您查找任务 id 并从 celery 中了解它是否已完成以及结果是什么(卡被拒绝等)。

    使用 Celery 作为 cron

    当您将 Celery 用作“cron 系统”时,您实际上所做的只是在说:“嘿,有人可以按 Y 计划生成 X 类型的工作吗”。创建了一个连续运行的进程,该进程大部分时间处于休眠状态,偶尔醒来,以按照您请求的时间表将一些工作注入队列。

    通常,您要求为您执行此操作的“嘿某人”是:celery beatbeat 从数据库中的某个位置或从您的设置文件。

    【讨论】:

    【解决方案2】:

    【讨论】:

    • celery 可用于定期以及在消息到达时处理来自消息队列的数据。但是 cron 作业只能用于周期性任务,我们需要设置作业将在什么时间定期运行。我说的对吗?
    • 正确。你可以安排它每分钟运行一次,让它看起来总是在后台处理,但是你会遇到竞争条件。
    猜你喜欢
    • 2014-07-22
    • 2014-03-02
    • 1970-01-01
    • 2011-08-17
    • 2020-06-29
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多