6

我正在开发一个 django 网络服务器,另一台机器(具有已知 IP)可以将电子表格上传到我的网络服务器。电子表格更新后,我想在电子表格上触发一些处理/验证/分析(这可能需要超过 5 分钟 --- 太长了,其他服务器无法合理地等待响应),然后发送另一台机器(使用已知 IP)一个 HttpResponse 指示数据处理已完成。

我意识到你不能processing.data()在返回后做HttpResponse,但功能上我想要看起来像这样的代码:

# processing.py
def spreadsheet(*args, **kwargs):
    print "[robot voice] processing spreadsheet........."
    views.finished_processing_spreadsheet()

# views.py
def upload_spreadsheet(request):
    print "save the spreadsheet somewhere"
    return HttpResponse("started processing spreadsheet")
    processing.data()

def finished_processing_spreadsheet():
    print "send good news to other server (with known IP)"

我知道如何单独编写每个函数,但是在返回响应processing.data() 如何有效地调用?views.upload_spreadsheet

我尝试使用django 的request_finished信号框架,但这不会processing.spreadsheet()在返回 HttpResponse. 我尝试views.upload_spreadsheet在同样的问题上使用装饰器。

我有一种暗示,这可能与编写中间件或可能与自定义基于类的视图有关,我对此都没有任何经验,所以我想我会向宇宙提出问题以寻求帮助。

谢谢你的帮助!

4

2 回答 2

5

事实上 Django 有一个同步模型。如果你想做真正的异步处理,你需要一个消息队列。django 最常用的是 celery,它可能看起来有点“矫枉过正”,但这是一个很好的答案。

我们为什么需要这个?因为在 wsgi 应用程序中,apache 向可执行文件发出请求,并且可执行文件返回文本。只有当可执行文件完成执行时,apache 才知道请求结束。

于 2012-02-29T08:51:41.090 回答
3

您实施的问题在于,如果正在处理的电子表格数量等于工作人员数量:您的网站将不再响应。

您应该使用后台任务队列,基本上有2 个进程:您的服务器和后台任务管理器。服务器应将电子表格的处理委托给后台任务管理器。当后台任务完成后,它应该以某种方式通知服务器。例如,它可以做model_with_spreadsheet.processed = datetime.datetime.now()。

您应该使用后台作业管理器,如django-ztask(非常简单的设置)、celery(非常强大,在您的情况下可能有点过分)甚至uwsgi spooler(这显然需要 uwsgi 部署)。

于 2012-02-29T08:47:45.853 回答