2011-06-23 85 views
3

我目前正在開發高負載項目,我需要使用C/FastCGI/nginx組合。FastCGI fork in c

問題是,我需要我的FastCGI應用程序在線程/進程中運行。

我知道兩種方法可以做到這一點:

1)編譯程序,比使用產卵 - fcgi的到餐桌的過程。 (我不能用這個)

2)運行FCGX_Init(),比前叉10個processess前while (FCGX_Accept_r(&request) >= 0)

3)運行並行線程後while (FCGX_Accept_r(&request) >= 0)

所以,我的問題是:WHIS是運行fastcgi應用程序的最快方法。我可以在這之後的預叉FastCGI應用:

int sock = FCGX_OpenSocket(":9000", 10); 
FCGX_InitRequest(&request, sock, 0); 

10個進程能聽單插座?我是否必須使用線程,如果我有N進程正在運行?這會足夠嗎?

+0

爲什麼你不能使用'spawn-fcgi'?這似乎是最好的選擇,因爲它會爲你處理負載均衡叉。 – T0xicCode

回答

4

我不知道您正在使用的FastCGI API,但通常您不能將文件描述符(即套接字)交給另一個進程,除非它在分叉前打開。進程具有獨立的文件描述符表。線程將全部共享相同的文件描述符表,因爲它們處於相同的進程中。

就我所知,您一次只能在一個端口上監聽一個進程。通常做的是讓一個線程的唯一工作是監聽連接。當它獲得一個時,連接將被接受並交給池中的下一個工作線程,方法是讓線程接管已接受的套接字(而不是偵聽套接字),直到套接字關閉。監聽線程立即返回監聽連接。

這應該給你最小的開銷。