我目前正在开发高负载项目,需要使用C/FastCGI/nginx组合。
问题是,我需要我的 FastCGI 应用程序在线程/进程中运行。
我知道有两种方法可以做到这一点:
1)编译程序,然后使用spawn-fcgi来fork进程。 (这个我用不了)
2) 运行FCGX_Init()
,然后在 while (FCGX_Accept_r(&request) >= 0)
之前预 fork 10 个进程
3) 在 while (FCGX_Accept_r(&request) >= 0)
之后运行 pthreads
所以,我的问题是:whis 是运行 fastcgi 应用程序的最快方法。我可以在此之后预 fork fastcgi 应用程序吗:
int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);
可以 10 个进程监听单个套接字吗?如果我有 N 个进程正在运行,我是否必须使用线程?这样就够了吗?
最佳答案
我不知道您具体使用的 FastCGI API,但一般来说,您不能将文件描述符(即套接字)传递给另一个进程,除非它在 fork 之前打开。进程有独立的文件描述符表。线程将共享相同的文件描述符表,因为它们位于同一进程中。
据我所知,一次只能有一个进程在端口上监听。通常所做的事情是有一个线程,其唯一的工作就是监听连接。当它得到一个时,连接被接受并交给池中的下一个工作线程,通过让线程接管接受的套接字(而不是监听套接字)直到套接字关闭。监听器线程立即返回监听连接。
这应该给您带来最小的开销。
关于c - FastCGI 在 c 中的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460756/