【问题标题】:Wsgi single thread configuration on a multi-threaded apache server多线程 apache 服务器上的 Wsgi 单线程配置
【发布时间】:2023-03-04 07:16:07
【问题描述】:
WSGIDaemonProcess <user> processes=5 threads=1 python-home=/path/to

WSGIProcessGroup <user>
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIApplicationGroup %{GLOBAL}

我的应用程序使用 Gdal,它不是线程安全的。 documentation 建议将 wsgi 与 threads=1 一起使用。如果apache配置使用线程mpm-workerthreads=1会保证线程安全吗?

Apache 设置:

KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 5
MinSpareThreads 1
MaxSpareThreads 3
ThreadsPerChild 5

接受答案的complementary quote 如下:

StartServers          2
ThreadsPerChild      25
WSGIDaemonProcess processes=1 threads=15

对于 WSGI 应用程序,Apache 子工作进程 仅充当代理,将请求转发到 mod_wsgi 用于处理的守护进程模式进程。

因此,对于 2 个 Apache 子工作进程,最大数量 连接数为 50(每个有 25 个线程)。这些 Apache 孩子 工作进程接受静态文件请求的连接和 然后被代理到 mod_wsgi 守护进程的动态请求 模式过程。只有一个 mod_wsgi 守护进程模式进程, WSGI 应用程序本身将能够处理 15 个并发请求。

如果有请求被 mod_wsgi 守护模式进程处理, 因为 Apache 子工作进程正在代理请求并且 响应,在请求的生命周期内仍会消耗一个线程 Apache 子工作进程。 35 (50-15) 个附加线程 在 Apache 子工作进程中仍可用于处理 静态请求,保持连接并充当缓冲 针对 WSGI 应用程序的挂起动态请求的机制。这 后者对于作为 apache 童工的慢速客户端特别有用 进程不会将请求转发到 mod_wsgi 守护进程,直到 提供完整的请求信息。

注意只是因为mod_wsgi守护模式进程只能处理15个 并发请求并不意味着它只能处理那么多 每秒请求数。每秒将有多少个请求 取决于您的应用程序有多慢以及存在的争用情况 关于共享资源。后者对是否运营有影响 需要序列化。

总体而言,只需将 mod_wsgi 守护程序模式视为类似于使用 mod_proxy 在单独的后端 Web 服务器前面。在这种情况下 虽然 mod_wsgi 已经创建了守护进程并正在管理它们 代表你。

格雷厄姆·邓普顿

【问题讨论】:

  • 赞许引用,非常有价值的信息应该在 mod_wsgi 的页面中更清楚地记录。

标签: django apache2 mod-wsgi wsgi single-threaded


【解决方案1】:

当使用 mod_wsgi 守护进程模式时,Python 请求在独立于 Apache 子工作进程的进程中处理,所以是的,在这种情况下使用 threads=1 将保证线程安全。

有关 mod_wsgi 中的进程和线程如何工作的更多信息,请阅读有关它的文档:

你也可以观看:

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 2021-06-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2011-07-14
    相关资源
    最近更新 更多