FastCGI的并发处理

我还没找到异步处理的方式。如果有异步的实现方式,那就可以单线程异步处理多个并发请求了。

不过我在FastCGI的sample里面找到了多线程的方式,多线程的方式封装一下应该也可以达到异步的效果的。比如,doit()线程把 FCGX_Request request丢给另一个线程A处理,然后doit()线程阻塞的等待线程A的返回结果。那么线程A实际上就可以采取异步的方式来处理请求了。

以下是FastCGI的sample里面的多线程实现:

/*
 * threaded.c -- A simple multi-threaded FastCGI application.
 
*/


#ifndef lint
static   const   char  rcsid[]  =   " $Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $ " ;
#endif  /* not lint */

#include 
" fcgi_config.h "

#include 
< pthread.h >
#include 
< sys / types.h >

#ifdef HAVE_UNISTD_H
#include 
< unistd.h >
#endif

#include 
" fcgiapp.h "


#define  THREAD_COUNT 20

static   int  counts[THREAD_COUNT];

static   void   * doit( void   * a)
{
    
int rc, i, thread_id = (int)a;
    pid_t pid 
= getpid();
    FCGX_Request request;
    
char *server_name;

    FCGX_InitRequest(
&request, 00);

    
for (;;)
    
{
        
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
        
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;

        
/* Some platforms require accept() serialization, some don't.. */
        pthread_mutex_lock(
&accept_mutex);
        rc 
= FCGX_Accept_r(&request);
        pthread_mutex_unlock(
&accept_mutex);

        
if (rc < 0)
            
break;

        server_name 
= FCGX_GetParam("SERVER_NAME", request.envp);

        FCGX_FPrintF(request.
out,
            
"Content-type: text/html "
            
" "
            
"<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
            
"<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
            
"Thread %d, Process %ld<p>"
            
"Request counts for %d threads running on host <i>%s</i><p><code>",
            thread_id, pid, THREAD_COUNT, server_name 
? server_name : "?");

        sleep(
2);

        pthread_mutex_lock(
&counts_mutex);
        
++counts[thread_id];
        
for (i = 0; i < THREAD_COUNT; i++)
            FCGX_FPrintF(request.
out"%5d " , counts[i]);
        pthread_mutex_unlock(
&counts_mutex);

        FCGX_Finish_r(
&request);
    }


    
return NULL;
}


int  main( void )
{
    
int i;
    pthread_t id[THREAD_COUNT];

    FCGX_Init();

    
for (i = 1; i < THREAD_COUNT; i++)
        pthread_create(
&id[i], NULL, doit, (void*)i);

    doit(
0);

    
return 0;
}



另外, FCGX_Accept_r()可以在 FCGX_Finish_r()之前连续accept多个request,这应该也代表着一种异步的方法。不过需要构造多个request对象给 FCGX_Accept_r()。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值