python - 在Django下执行长时间运行的任务/批处理的可靠方法是什么?

标签 python django batch-processing

我有一个Django应用,打算在LAN上的Virtualbox VM上运行。基本用户将是精明的IT最终用户,而不是sysadmin。

该应用程序的一部分工作是连接到LAN上的外部数据库,对这些数据库运行一些python批处理,并将结果保存在其本地db中。然后,用户可以使用Django页面浏览系统。

批处理的运行时间并没有那么长,但可以运行到几分钟,可能长达几十分钟,而不是几秒钟。运行频率充其量很少,我认为您可以花几天时间而无需刷新。

这不是celery的长任务正常使用情况,最终会通过ajax和/或轮询将结果推回Web UI。它更类似于开发人员偶尔使用django-admin命令,但这一次是面向最终用户的。

用户应能够在需要时启动一个或多个批处理的运行,以刷新给定外部数据库的计算(目标数据库是该批处理的参数)。

在完成给定数据库的批处理之前,该应用程序确实无法使用。您可以访问其页面,但是许多功能将不可用。

从支持的角度来看,批处理始终保持易于运行非常重要。降落到虚拟机SSH可能需要频繁握住,这并不好-最好从Django网页启动它们。

我目前所拥有的:

每个批次都在其自己的脚本中。


我可以在命令行上运行它(通过__name__ ==“ main” :)。
批次也作为芹菜任务挂接,并且可以正常工作。
考虑到我编写它们的方式,允许我从Python中的子进程调用运行它们相对容易。我还没有真正研究过它,但是我想我也可以将它们放入django-admin命令中。
这些批次已经有自己的基本状态检查。例如,他们可以查看计算出的数据,并判断它们是否已运行并将其显示在Django页面中,而无需查看celery任务状态后端。
批次本身相对强大,我可以使其更强大。这是关于它们的启动机制。


不太好。

在Mac开发环境中,我发现celery / celerycam / rabbitmq堆栈有些不稳定。似乎有时Rabbitmqs守护程序在CPU / RAM使用中迅速增加,然后需要终止。这可能会使芹菜加工过程感到困惑,我发现我必须杀死-9个不同的任务并手动重新启动它们。有时celery仍然有效,但是celerycam不能工作,因此没有任务更新。其中一些问题可能是OSX特有的,或者可能是由于DEBUG标志暂时切换所致,这是芹菜警告的。

因此,我需要在命令行上运行批处理,这是我要避免的操作,直到重置了整个芹菜堆栈。

在普通网站上,管理员可以监视它,这是可以接受的。但是我不能在只有用户有权访问的远程VM上发生这种情况。

考虑到这些都是一劳永逸的批次,我想知道芹菜在这一点上是否还算不算过分。

我考虑过的一些选择:


编写清理shell / Python脚本以重新启动rabbitmq / celery / celerycam,通常使其更强大。即使芹菜和一切稳定所需的一切。我已经使用psutil找出兔子/芹菜进程正在运行,并在Django中显示它们的状态。
而是通过子流程运行批次,避免使用芹菜。那么django-admin命令呢?这有什么区别吗?仍然需要从网页上运行。
芹菜的替代任务/过程管理器功能较少,但活动部件也较少?
不使用子进程,而是依靠Python多处理模块?老实说,我不知道与通过子流程启动相比。


环境:
  nginx,wsgi,virtualbox上的ubuntu,厨师来构建VM。

最佳答案

我不确定您的芹菜配置如何使其不稳定,但听起来它仍然最适合您的问题。我使用redis作为队列系统,根据我的经验,它比rabbitmq更好。也许您可以尝试一下,看看它是否可以改善情况。

否则,只需使用cron作为驱动程序来运行定期任务。您可以让它定期运行脚本并更新数据库,您的UI组件将轮询数据库而不会发生冲突。

关于python - 在Django下执行长时间运行的任务/批处理的可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952327/

相关文章:

oracle - 关闭 Kettle 中的批处理?

python - 切片 `a`(例如 `a[1:] == a[:-1]`)是否创建 `a` 的副本?

python - 遍历返回 NotImplemented 的 Python 特殊方法的 MRO

python - 是否可以在 matplotlib 中为边缘颜色分配颜色图?

python - 删除 Django,因为我现在使用 VirtualEnv

php - 在单个 php 脚本上运行多个 php 脚本

python - 匹配 Python 字典中的实数键

python - Django : Form data not saving

python - Django Rest Framework ViewSet 的其他 View

matlab - 关闭 Octave 中的警告