Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django下执行长时间运行的任务/批处理的健壮方法是什么?_Python_Django_Batch Processing - Fatal编程技术网

Python 在Django下执行长时间运行的任务/批处理的健壮方法是什么?

Python 在Django下执行长时间运行的任务/批处理的健壮方法是什么?,python,django,batch-processing,Python,Django,Batch Processing,我有一个Django应用程序,打算在局域网上的Virtualbox虚拟机上运行。基本用户将是精明的IT最终用户,而不是系统管理员 该应用程序的部分工作是连接到局域网上的外部数据库,对这些数据库运行一些python批处理,并将结果保存在其本地数据库中。然后,用户可以使用Django页面浏览系统 批处理的运行时间并没有那么长,但可以运行到分钟,可能是几十分钟,而不是几秒钟。运行频率充其量是很少的,我想你可以花上几天不需要刷新 这不是芹菜的长任务的正常用例,长任务最终会通过ajax和/或轮询将结果推回

我有一个Django应用程序,打算在局域网上的Virtualbox虚拟机上运行。基本用户将是精明的IT最终用户,而不是系统管理员

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

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

这不是芹菜的长任务的正常用例,长任务最终会通过ajax和/或轮询将结果推回到web UI中。它更类似于开发人员偶尔使用django管理命令,但这次是针对最终用户的

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

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

从支持的角度来看,批始终保持轻松运行是非常重要的。下载到VMs SSH可能需要频繁的握手,这并不好——最好从Django网页启动它们

我目前拥有的:

每个批都有自己的脚本

  • 我可以在命令行上运行它(如果uuu name uuuu==“main”:)

  • 这些批次也作为芹菜任务连接起来,这样做效果很好

  • 考虑到我编写它们的方式,允许从Python中的子进程调用运行它们对我来说相对容易。我还没有真正研究过它,但我想我也可以把它们变成django管理命令

  • 批次已经有了自己的基本状态检查。例如,他们可以查看计算出的数据,判断它们是否已运行,并在Django页面中显示这些数据,而无需查看芹菜任务状态后端

  • 批次本身是相对健壮的,我可以让它们更健壮。这是关于他们的发射机制

  • 什么不太好。

    在macdev环境中,我发现芹菜/celerycam/rabbitmq堆栈有些不稳定。似乎有时rabbitmqs守护进程在CPU/RAM使用中膨胀,然后需要终止。这严重混淆了芹菜进程,我发现我必须杀死-9个不同的任务并手动重新启动它们。有时芹菜仍然有效,但芹菜不起作用,所以没有任务更新。其中一些问题可能是OSX特有的,也可能是由于调试标志暂时被切换,芹菜对此发出了警告

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

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

    考虑到这些是一些火和遗忘批次,我想知道芹菜是否在这一点上是过度杀伤力

    我考虑过的一些选择:

  • 编写清理shell/Python脚本以重新启动rabbitmq/celery/celerycam,并通常使其更加健壮。i、 e.使芹菜更稳定所需的任何东西。我已经使用了psutil来确定rabbit/Cellery进程正在运行,并在Django中显示它们的状态

  • 而是通过子流程运行批处理,避免芹菜。这里的django管理命令呢?这有区别吗?仍然需要从网页上运行

  • 一个替代芹菜的任务/流程管理器,功能更少,但活动部件也更少

  • 不使用子流程,而是依赖Python多处理模块?老实说,我不知道这与通过子流程启动相比如何

  • 环境:
    nginx、wsgi、virtualbox上的ubuntu、构建VMs的厨师。

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


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

    cron无法工作,因为用户需要能够决定何时运行。但如果不是这样,那么cron就可以了——它是我需要的启动器,比任务和队列系统更重要。但我会检查redis,而不是rabbitmq,看看这是否有区别。我想我担心的是:rabbitmq+celery+celerycam+my batches意味着比我的批次更多的东西可能出错。我想补充一点,对于我的用例,芹菜堆栈自从切换到redis以来已经更加稳固。另外一个好处是,我还可以将redis用于Django缓存。所以txs再次提出建议。