首页 文章

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

提问于
浏览
17

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

一旦 success 函数被触发,'s the code I have. Basically I' d就像 start_processing 一样开始 . 但是 start_processing 是一种可能很容易花费几分钟或失败的功能(它希望用户在呈现视图之前必须等待它成功完成 . ('Success',就他们而言,它们并不依赖关于 start_processing 的结果;如果它失败,我是唯一需要担心的人 . )

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

从Django中使用的Google搜索引用,而不是cron作业更合适 . 但是我很想在用户获得成功函数后立即开始 start_processing ,而不是等到cron作业运行 . 有没有办法做到这一点?

4 回答

  • 5

    我不确定你需要一个线程 . 听起来你只想生成一个进程,所以请查看 subprocess 模块 .

  • 9

    如果你真的需要快速入侵,只需使用subprocess启动一个进程 .

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

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

    干杯

  • 20

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

    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

    IIUC,这里的问题是webserver进程可能不喜欢额外的长时间运行的线程,它可能会随着需求的上升和下降等而杀死/生成服务器进程等 .

    通过与外部服务进程进行此类处理的沟通,您可能更好,而不是将其嵌入到Web服务器的wsgi / fastcgi进程中 .

    如果您发送的唯一内容是文件路径,那么编写该服务应用程序应该非常容易 .

相关问题