【问题标题】:Is FastCgi thread-safe?FastCgi 是线程安全的吗?
【发布时间】:2011-02-21 02:44:50
【问题描述】:

我对 FastCGI 的工作原理有点困惑。我的程序真的只有一个实例在运行,还是有一些神奇的线程在运行?这很重要,因为如果我的数据结构的范围在主循环之外,我需要知道这些数据结构是否需要是线程安全的。

编辑:我的应用在 Perl 中,这是我的 apache2 配置:

<IfModule mod_fastcgi.c>
   AddHandler fastcgi-script .fcgi .fcg
   FastCgiServer /usr/lib/app/process.fcg -idle-timeout 60 -processes 1
 </IfModule>

只是为了清楚我在问什么...对于这段代码:

use CGI::Fast qw/:standard/;

my %sharedHash;

while (new CGI::Fast) {
     # do stuff with %sharedHash
}

“do stuff”部分是安全的还是某些“多线程魔法”正在发生,这可能意味着多个线程同时执行“do stuff”,从而破坏%sharedHash

【问题讨论】:

    标签: fastcgi


    【解决方案1】:

    FastCGI 本身只是 Web 服务器和应用程序之间的接口。您的应用程序可以是多线程的(Java 几乎总是这种情况,通常在 Python 中),或者以异步、事件驱动的风格(Python 中的 Twisted、Node.js 等)编写。如果是前者,那么您需要确保对全局状态结构的访问是正确的线程同步的。

    来自the FastCGI whitepaper架构独立性。 CGI 不依赖于任何特定的服务器架构(单线程、多线程等)。

    【讨论】:

      【解决方案2】:

      我相信这取决于 Fast-CGI 应用程序。查看FastCGI specification 第 4 节(管理记录类型),应用程序指定了 3 个有关并发连接的值:

      • FCGI_MAX_CONNS:最大并发传输连接数 此应用程序将接受,例如“1” 或“10”。

      • FCGI_MAX_REQS:本应用最大并发请求数 会接受,例如“1”或“50”。

      • FCGI_MPXS_CONNS: 如果此应用程序不复用,则为“0” 连接(即处理并发 每个连接上的请求),“1” 否则。

      由此看来,只要您的应用程序为FCGI_MAX_CONNSFCGI_MAX_REQS 指定1,为FCGI_MPXS_CONNS 指定0,那么任何符合FastCTI 的Web 服务器会将您的应用程序视为完全单线程的,可能会启动新进程来处理对 Web 服务器的并发请求。

      更新:关于“魔术线程”和您的数据结构,除非您在多个请求之间共享您的数据结构,否则我看不出它们需要线程安全的任何理由 - 我可以'没有任何理由使用多个线程来处理单个请求,但这确实取决于您的 FastCGI 库。

      【讨论】:

      • 请查看我编辑中的代码以澄清我的问题...我不知道如何回答“除非您在多个请求之间共享您的数据结构”...我想这是我的问题...我是否在多个请求之间共享它们?
      • @JoelFan 这取决于您的代码。您是否有任何数据结构存储在共享内存中,您的程序的多个实例可以访问这些数据结构? FastCGI 进程的生命周期很长,将在其生命周期内为多个请求提供服务。如果你不想处理线程安全问题,你可以只使用静态分配配置 FastCGI 并只使用一个进程。
      猜你喜欢
      • 2021-10-12
      • 2015-04-18
      • 2011-10-07
      • 2012-03-02
      • 2011-10-28
      • 2023-03-14
      • 2016-08-24
      • 2011-08-16
      • 2011-09-28
      相关资源
      最近更新 更多