FastCgi是线程安全的吗?

时间:2011-02-21 02:44:51

标签: fastcgi

我对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?< / p>

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我认为这取决于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库。