Python Django在执行计算密集型任务时不响应Ajax调用

Python Django在执行计算密集型任务时不响应Ajax调用,python,ajax,django,asynchronous,backend,Python,Ajax,Django,Asynchronous,Backend,我最近正在使用Django为我的“科学计算引擎”编程我的web界面 我将“计算引擎”包装为python模块,并在Django框架内调用它 “引擎”的compute()功能运行需要几分钟(我使用ajax触发它),同时,我让前端每0.5秒进行一次额外的ajax调用,以将CPU和内存状态更新到前端。但是我发现服务器在compute()完成之前不会响应额外的ajax调用 在四处搜索之后,我想我可能会使用异步或多线程 因此,我在views.py中创建函数,如下所示 def提交(请求): #一些准备 ...

我最近正在使用
Django
为我的“科学计算引擎”编程我的web界面

我将“计算引擎”包装为python模块,并在Django框架内调用它

“引擎”的
compute()
功能运行需要几分钟(我使用
ajax
触发它),同时,我让前端每0.5秒进行一次额外的
ajax
调用,以将CPU和内存状态更新到前端。但是我发现服务器在
compute()
完成之前不会响应额外的
ajax
调用

在四处搜索之后,我想我可能会使用
异步
多线程

因此,我在
views.py中创建函数,如下所示

def提交(请求):
#一些准备
........
#呼叫引擎
t=线程(目标=计算)
t、 开始()
返回HttpResponse(“已启动”)

但是系统仍然没有响应我额外的
ajax
调用,直到
compute()
完成(“引擎”只使用了大约20%的CPU,因此还有足够的计算能力)

我是一个后端编程新手,我不确定Django或后端服务器如何在内部处理请求。
如果有人能给我一些关于如何处理这种情况的提示,我将非常感谢

从这样的视图开始线程从来都不是一个好主意

解决此问题的最常见方法是将工作委派给单独的工作人员/流程。除了django之外,还有另一个python进程正在寻找工作

您可以保持简单,并使Django视图将需要以某种格式在磁盘或数据库中完成的工作的信息存储在磁盘或数据库中(这将是工作队列)。然后,辅助进程将在循环中运行,每N秒检查一次可用工时。增加工作人员/进程的数量以增加计算能力(当然受硬件限制)

创建工作请求的http请求可以返回一个
job\u id
,用户可以查询该作业的状态。工作是否待定/正在进行/已完成?然后,用户还可以获取作业的结果,甚至元数据,如持续时间和日志

还有一些框架可以解决像芹菜和django频道这样的问题。芹菜可能更容易开始,但它可能是过度为您所试图做的


像这样使用worker的好处是,您可以在前端有一个非常轻量级的REST api,并且可以随着需求的增加,扩展worker的数量,可能跨越多个服务器。

我最终通过使用python
子流程解决了这个问题。

我将我的“计算”代码放在一个单独的文件中,并使用
Popen
调用它


从子流程导入Popen
def提交(请求):
#一些准备
........
#呼叫引擎
p=Popen([“python”,“compute.py”,]))
返回HttpResponse(“已启动”)


然而,正如所建议的,
子流程
并不是一个非常好和安全的做法。这个解决方案很容易实现,但我会尝试使用
芹菜
或@Grimmy建议的
django频道将后端转换为
工作模式

你可能想研究芹菜之类的东西。我建议现在就使用芹菜,因为项目已经成熟、稳定并且有很好的文档记录。如果你有非常简单的要求,你也可以只为api和工人之间的数据通信做一个存储,而不必添加芹菜所需的所有额外的东西。