Python Apache上的多进程应用

Python Apache上的多进程应用,python,apache,flask,mod-wsgi,python-multiprocessing,Python,Apache,Flask,Mod Wsgi,Python Multiprocessing,我试图用Python3/Flask创建一个简单的web应用程序,并在Apache上提供它。我不知道如何使我的应用程序响应多个请求 这是我的wsgi文件: import sys import os sys.path.insert(0, '/var/www/html/FlaskDeploy') from apps import app as application 此代码摘自httpd.conf文件: <VirtualHost *:80> DocumentRoot /

我试图用Python3/Flask创建一个简单的web应用程序,并在Apache上提供它。我不知道如何使我的应用程序响应多个请求

这是我的wsgi文件:

import sys
import os
sys.path.insert(0, '/var/www/html/FlaskDeploy')

from apps import app as application
此代码摘自
httpd.conf
文件:

<VirtualHost *:80>
        DocumentRoot /var/www/html/FlaskDeploy
        WSGIScriptAlias / /var/www/html/FlaskDeploy/app.wsgi
        WSGIDaemonProcess apps threads=1 python-path=/var/www/html/FlaskDeploy/env/bin:/var/www/html/FlaskDeploy/env/lib/python3.6/site-packages

        <Directory /var/www/html/FlaskDeploy>
        WSGIScriptReloading On
        WSGIProcessGroup apps
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
        </Directory>
</VirtualHost>

DocumentRoot/var/www/html/FlaskDeploy
WSGIScriptAlias//var/www/html/FlaskDeploy/app.wsgi
WSGIDaemonProcess apps threads=1 python路径=/var/www/html/FlaskDeploy/env/bin:/var/www/html/FlaskDeploy/env/lib/python3.6/site-packages
WSGIScript正在重新加载
WSGIProcessGroup应用程序
WSGIApplicationGroup%{GLOBAL}
命令拒绝,允许
通融
一切正常,但应用程序会逐个运行请求。例如,假设每个用户执行耗时3分钟的繁重数据库操作。在这种情况下,当来自不同位置的3个用户同时打开应用程序时,最后一个用户必须等待9分钟(包括其他用户要完成的操作)

基本上,我想创建一个能够处理多个请求的web应用程序


我来自NodeJS世界,我从未在NodeJS上遇到过这个问题。它在一个线程上运行,但可以处理多个请求。

它一次只能处理一个请求,因为这就是您告诉mod_wsgi在使用时要做的:

threads=1
不要设置该选项,它将默认为守护进程进程组中的15个线程,这就是它可以并发处理的请求数

如果您的请求是I/O绑定的,那么一开始就可以了,以后可以进行调优。如果您的请求对CPU的限制大于对I/O的限制,那么也开始引入额外的进程,并在它们之间分发请求

processes=3 threads=5
即使I/O受到严重限制,也不要在每个进程中增加太多线程,最好还是将它们分布在各个进程中,因为Python在每个进程中线程数很高的情况下不能很好地工作

有关更多信息,请阅读文档:


它一次只能处理一个请求,因为这是您告诉mod_wsgi在使用时要做的:

threads=1
不要设置该选项,它将默认为守护进程进程组中的15个线程,这就是它可以并发处理的请求数

如果您的请求是I/O绑定的,那么一开始就可以了,以后可以进行调优。如果您的请求对CPU的限制大于对I/O的限制,那么也开始引入额外的进程,并在它们之间分发请求

processes=3 threads=5
即使I/O受到严重限制,也不要在每个进程中增加太多线程,最好还是将它们分布在各个进程中,因为Python在每个进程中线程数很高的情况下不能很好地工作

有关更多信息,请阅读文档:


如果一次只有一个进程来处理请求,那么负责的是apache配置,而不是flask。无论如何,如果您的请求导致的操作持续时间可能超过几百毫秒,那么您应该认真研究任务队列,比如Celery如果一次只有一个进程处理请求,那么负责的是您的apache配置,而不是flask。无论如何,如果您的请求导致操作持续时间超过几百毫秒,您应该认真查看任务队列,如Celery感谢您的帮助Graham,但我不明白这是解决了我的问题还是只是将限制从3个用户增加到15个?我不明白为何会有限制。我只是希望所有的过程都能同时完成。在同一台服务器(Azure)上,我的NodeJS应用程序正在运行,最多可以响应50000个请求。我做错了什么?你看过链接的文档了吗?WSGI应用程序依赖于有一个固定的进程和线程池来处理请求。因此,WSGI应用程序可以处理的并发请求(不是用户会话,因为这是不同的概念)的数量有一个硬限制。由于守护进程模式默认为单个进程,并且您告诉它在该进程中可用于处理请求的最大线程数为1,因此一次只能处理请求。只需删除
threads=1
并再次测试。您会看到NodeJ处理更多并发请求,因为它使用异步模型,而不是进程/线程,因此能够处理更多并发请求,因为当使用进程/线程处理并发时,WSGI应用程序没有严格的上限。我理解。我已经阅读了文档,只是删除了threads=1并再次测试了它。是的,现在应用程序可以处理更多请求,但对于大量请求(如10k、20k),这仍然是一个非常严重的问题。我这样问是因为我不知道并试图理解如何克服这个问题,或者这就是Python web应用程序的基本工作原理?我从未在PHP或Java中遇到过这种情况。使用Python(如Youtube或Dropbox)的伟大系统能处理如此多的请求?WSGI是否太简单了?如果你能启发我,我会很高兴。进程/线程的数量减少并不意味着你不能同时处理大量用户。原因是,在一个实现良好的系统中,处理请求所需的时间不到50-100毫秒,因此即使使用单个线程,理论上每秒也可以处理10-20个请求。当您有更多的线程和进程时,显然可以处理更多的事务。对于每秒10k或20k的请求,无论如何,您不会在一台主机上执行此操作,您将运行多台主机并在它们之间进行负载平衡。你不应该认为你可以使用一台主机。谢谢你的帮助,格雷厄姆,但我不明白是它解决了我的问题,还是只是将限制从3个用户增加到15个?我不明白为何会有限制。我只是