Django文件上载是否占用上载期间的进程?

Django文件上载是否占用上载期间的进程?,django,apache,file-upload,mod-wsgi,Django,Apache,File Upload,Mod Wsgi,我通过mod_wsgi(守护进程模式,3个工作进程)在apache后面使用Django 1.3 如果用户正在上载文件,那么在上载期间,这是否完全占用了其中一个进程,或者在等待数据块可用时,它是否可以处理其他请求?如果3个用户正在上载3个文件,是否会将所有新请求排队,直到上载完成 编辑:我目前正在使用worker mpm,每个守护进程一个线程。如果有充分的理由,我愿意更改配置 编辑2:理想情况下,我希望apache能够处理上传,并在上传完所有文件后将其传递给django。这是默认情况下的行为方

我通过mod_wsgi(守护进程模式,3个工作进程)在apache后面使用Django 1.3

如果用户正在上载文件,那么在上载期间,这是否完全占用了其中一个进程,或者在等待数据块可用时,它是否可以处理其他请求?如果3个用户正在上载3个文件,是否会将所有新请求排队,直到上载完成


编辑:我目前正在使用worker mpm,每个守护进程一个线程。如果有充分的理由,我愿意更改配置



编辑2:理想情况下,我希望apache能够处理上传,并在上传完所有文件后将其传递给django。这是默认情况下的行为方式吗?如果没有,我会更改任何配置以实现这一点吗?

因为您使用的是单线程mod_wsgi守护进程,那么整个守护进程将在整个上载期间被占用。这是因为请求内容直接流式传输到Django应用程序,并且在请求传递到mod_wsgi之前,Apache不会预读取请求内容。

您说过:

理想情况下,我希望apache能够处理上传,并在上传完所有文件后将其传递给django

唉,HTTP并不是这样工作的。问题在于http请求主体可以是文件,也可以是消息队列,或者是八位字节流(可能是空的)的其他创造性用途。首先,这意味着应用服务器决定如何处理请求体是错误的;应用程序可能希望读取请求的一部分,如果它没有通过测试(例如,无效的身份验证凭据或任何原因),它可以在将任何带宽用于无效请求之前关闭连接

当请求的大小可以是任意的、无界的(例如,使用分块传输编码)时,这尤其令人担忧。应用服务器可以优雅地将请求主体抽象为一个简单的文件流,但对于它的最终命运,没有比这更好的决定了

由于这个原因,HTTP服务器通常在读取了所有的头之后立即调用应用程序,如果应用程序需要,请求主体可以进行流式处理

另一方面,应用程序框架的工作是抽象出常见的用途,django做到了这一点,允许您设置首选的上载目录和最大文件大小,以及一些其他选项。然而,如上所述,这仍然是HTTP考虑因素施加的严格限制。这通常效果很好,因为大多数服务器都提供足够的带宽和工作线程,以便仍然有效地使用硬件。一个典型的工作线程池(例如5-50个并发线程/进程),所有服务文件上传,可能不会让服务器机器有任何可用的IO来服务其他请求


如果您的应用程序不适合此模型,可能大多数请求实际上是CPU限制的,或者通常在ram中工作,但只有少数请求执行磁盘IO以上载文件,那么您无论如何都需要进行一些自定义调优,例如,您可能需要将服务重构为一个异步框架,以便能够有效地处理数千到几十万个并发但速度较慢的请求,或者只是在不同的应用程序服务器之间平衡不同类型的请求。Apache是一个很好的通用应用程序服务器,但对于特定的应用程序来说,它很少是最快的。

您需要提供更多信息。您使用的是什么Apache MPM,它是如何设置的?您正在使用的WSGIDaemonProcess配置是什么?现在还不清楚您所说的3个工作进程是指Apache工作进程MPM和3个Apache子进程,还是3个守护进程。您也没有提到每个守护进程的线程。为什么要使用单线程守护进程模式进程?你的应用程序不是线程安全的吗?我的代码应该都是线程安全的,但我不知道我使用的第三方应用程序。此外,我还没有看到关于django框架是否是线程安全的明确声明。我所看到的只是“可能是”。所以我对使用多线程有点犹豫。随着我的应用程序开始做更多的I/O,我可能会研究ChangingTanks@TokenMacGuy,这是一个非常有用的答案。当格雷厄姆用django/apache的细节简洁地回答最初的问题时,我给了他一个记号。我预计不会有太多人同时上传文件,目前我主要担心的是,我不希望上传会妨碍快速请求的处理,所以我可能会增加我的工作人员池。如果它仍然不能处理一个专用的异步应用程序,听起来是一个很好的解决方案。