我对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>
答案 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_CONNS
和FCGI_MAX_REQS
指定 1 ,为FCGI_MPXS_CONNS
指定 0 那么任何符合FastCTI标准的Web服务器都会将您的应用程序视为完全单线程,可能会启动新进程来处理对Web服务器的并发请求。
更新关于“魔术线程”和您的数据结构,除非您在多个请求之间共享数据结构,否则我无法看到他们需要线程安全的任何原因 - 我可以'看到为什么多个线程将用于处理单个请求的任何原因,但这取决于您的FastCGI库。