【问题标题】:Multi-process Flask Application on ApacheApache 上的多进程 Flask 应用程序
【发布时间】:2018-03-15 19:24:11
【问题描述】:

我正在尝试使用 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>

一切正常,但应用程序一个接一个地运行请求。例如,假设每个用户执行需要 3 分钟的繁重数据库操作。在这种情况下,当来自不同位置的 3 个用户同时打开应用程序时,最后一个需要等待 9 分钟(包括其他人的操作才能完成)。

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

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

【问题讨论】:

  • 如果确实一次只有一个进程处理请求,那是你的 apache 配置,而不是烧瓶,这是负责任的。无论如何,如果您的请求导致操作持续超过几百毫秒,您应该认真查看任务队列,例如 celery

标签: python apache flask mod-wsgi python-multiprocessing


【解决方案1】:

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

threads=1

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

如果您的请求是 I/O 绑定的,那么一开始应该没问题,您可以稍后进行调整。如果您的请求受 CPU 限制多于 I/O 限制,请同时开始引入其他进程并在它们之间分配请求。

processes=3 threads=5

即使 I/O 受限,也不要将每个进程的线程增加太多,最好还是将它们分散到多个进程中,因为 Python 在每个进程的线程数较多的情况下效果不佳。

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

【讨论】:

  • 感谢 Graham 的帮助,但我不明白这是解决我的问题还是只是将限制从 3 个用户增加到 15 个?我不明白为什么会有约束。我只希望所有进程同时完成。在同一台服务器 (Azure) 上,我的 NodeJS 应用程序正在运行,最多可以响应 50.000 个请求。我做错了什么?
  • 您是否阅读了链接的文档? WSGI 应用程序依赖于有一个固定的进程池和线程来处理请求。因此,WSGI 应用程序可以处理的并发请求(不是用户会话,因为这是不同的概念)的数量存在硬性限制。因为守护程序模式默认为单个进程,并且您告诉它该进程中可用于处理请求的最大线程数为 1,因此您一次只能处理请求。只需删除 threads=1 并再次测试。
  • 您看到 NodeJS 处理更多并发请求,因为它使用 ASYNC 模型,而不是进程/线程,因此能够处理更多并发请求,因为没有严格的上限以同样的方式WSGI 应用程序有什么时候使用进程/线程来处理并发。
  • 我明白了。我已阅读文档并删除了 threads=1 并再次对其进行了测试。是的,现在应用程序可以处理更多请求,但是对于像 10k、20k 这样的大量请求,这仍然是一个非常严重的问题。我问是因为我不知道并试图了解如何克服这个问题,或者这基本上是 Python Web 应用程序的工作方式?我从未在 PHP 或 Java 中遇到过这种情况。像 Youtube 或 Dropbox 这样使用 Python 的优秀系统如何能够处理如此多的请求? WSGI 是否太简单了?如果你能启发我,我会很高兴。
  • 进程/线程数量较少并不意味着您不能同时处理大量用户。原因是在一个实现良好的系统中,处理请求将花费不到 50-100 毫秒,因此即使使用单个线程,理论上您每秒也可以处理 10-20 个请求。当您拥有更多线程和更多进程时,您显然可以处理更多。对于每秒 10k 或 20k 的请求,无论如何您都不会在一台主机上执行此操作,您将运行许多主机并在它们之间进行负载平衡。您不应该认为您可以使用单个主机。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多