Django celery 和 Django cron-jobs 用法的区别?

Difference between usage of Django celery and Django cron-jobs?

对不起,如果它的基础知识,但我没有在互联网上找到任何比较这两种技术的答案。我应该如何决定何时使用哪个,因为两者都可以用于调度和处理周期性任务。

这是一篇文章所说的:

Django-celery :

Jobs are essential part of any application that does some processing for you in the background. If your job is real time Django application celery can be used.

Django-cronjobs :

django-cronjobs can be used to schedule periodic_task which is a valid job. django-cronjobs is a simple Django app that runs registered cron jobs via a management command.

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

我搜索了 celery vs cron,发现了一些可能对您有帮助的结果。

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

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

cron

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

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

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

在大多数情况下,cron 系统应该是 愚蠢的:"just run this command at this time, thanks!"。

芹菜

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

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

用于网络应用程序的 Celery

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

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

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

使用 Celery 作为 cron

当您将 Celery 用作 "cron system" 时,您实际上在说:"hey, can someone please generate work of X type on Y schedule"。创建了一个连续 运行s 的进程,该进程大部分时间处于休眠状态,偶尔会醒来,以按照您请求的时间表向队列中注入一些工作。

通常你要求为你做的 "hey someone" 是:celery beatbeat 得到你的时间表想从数据库中的某处或您的设置文件中获取。