博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FastCGI的并发处理
阅读量:6084 次
发布时间:2019-06-20

本文共 2314 字,大约阅读时间需要 7 分钟。

hot3.png

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

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

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

/* * threaded.c -- A simple multi-threaded FastCGI application. */#ifndef lintstatic 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 
#include 
#ifdef HAVE_UNISTD_H#include 
#endif#include "fcgiapp.h"#define THREAD_COUNT 20static 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, 0, 0);    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 "            " "            "
FastCGI Hello! (multi-threaded C, fcgiapp library)"            "

FastCGI Hello! (multi-threaded C, fcgiapp library)

"            "Thread %d, Process %ld

"            "Request counts for %d threads running on host %s

",            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()。

转自:http://blog.csdn.net/wwwsq

转载于:https://my.oschina.net/mickelfeng/blog/290099

你可能感兴趣的文章
委托-匿名方法-Lambda表达式
查看>>
MPF配置文件参数管理
查看>>
四则运算程序生成
查看>>
PIE SDK矢量数据的创建
查看>>
洛谷p1064 金明的预算方案
查看>>
10步让你成为更优秀的程序员
查看>>
杭电ACM 2013
查看>>
CF10E Greedy Change 判断硬币系统是否能用贪心策略
查看>>
坑人的开发——记一次私活的坑人经历
查看>>
sys用户无法远程登陆
查看>>
加速原型设计
查看>>
Android中文API(145) —— NotificationManager
查看>>
JS DateTime 格式化
查看>>
ASP.NET RSA 加密
查看>>
数据库优化设计方案
查看>>
使用seajs出现间歇性jquery加载失败的问题记录
查看>>
多进程服务器架构
查看>>
Python的Pexpect的简单使用
查看>>
.NET设计模式(6):原型模式(Prototype Pattern)(转)
查看>>
.NET设计模式(17):命令模式(Command Pattern)(转)
查看>>