当前位置:  开发笔记 > 后端 > 正文

Django:在后台线程中启动进程?

如何解决《Django:在后台线程中启动进程?》经验,为你挑选了3个好方法。

我正在尝试研究如何在Django的后台线程中运行一个进程.我是Django和线程的新手,所以如果我使用的术语错了,请耐心等待.

这是我的代码.基本上我想start_processingsuccess触发功能后立即开始.然而start_processing是什么样的功能,可以很容易地需要几分钟或失败(这是依赖于作为我无法控制的外部服务),我不希望用户必须等待它的视图之前成功完成被渲染.(就他们而言,"成功"并不取决于结果start_processing;如果失败,我是唯一需要担心的人.)

def success(request, filepath):
    start_processing(filepath)
    return render_to_response('success.html', context_instance = RequestContext(request))

从谷歌搜索我已经完成,大多数人建议在Django中不使用后台线程,而是一个cron作业更合适.但是我很想start_processing在用户获得成功函数后立即开始,而不是等到cron作业运行.有没有办法做到这一点?



1> MiniQuark..:

如果您真的需要快速入侵,只需使用子进程启动进程即可.

但是我建议产生一个进程(甚至一个线程),特别是如果你的网站是公共的:如果负载很高(可能是"自然的"或者是一个简单的DoS攻击的结果),你会产生很多进程或线程,最终会耗尽所有系统资源并终止服务器.

我建议使用作业服务器:我使用Celery(Redis作为后端),它非常简单,效果很好.您可以查看许多其他作业服务器,例如RabbitMQ或Gearman.在您的情况下,作业服务器可能有点过分:您可以简单地运行Redis并将其用作轻量级消息服务器.以下是如何执行此操作的示例.

干杯



2> maydos..:

如果有人真的想要运行另一个线程

def background_process():
    import time
    print("process started")
    time.sleep(100)
    print("process finished")

def index(request):
    import threading
    t = threading.Thread(target=background_process, args=(), kwargs={})
    t.setDaemon(True)
    t.start()
    return HttpResponse("main thread content")

这将首先返回响应,然后将"process finished"打印到控制台.因此用户不会遇到任何延迟.

使用Celery绝对是一个更好的解决方案.但是,对于服务器数量有限的非常小的项目,安装Celery可能是不必要的.

您可能还需要在大项目中使用线程.因为在所有服务器上运行Celery并不是一个好主意.然后,将无法在每个服务器中运行单独的进程.您可能需要线程来处理这种情况.文件系统操作可能是一个例子.虽然这种情况不太可能,但使用长期运行的Celery仍然会更好.

明智地使用.



3> jcdyer..:

我不确定你需要一个线程.听起来你只是想要产生一个过程,所以看看subprocess模块.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有