`

FastCGI的并发处理

阅读更多

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

分享到:
评论

相关推荐

    FastCGI 下载FastCGI for IIS6下载 1.5(32位&64位)

    FastCGI的主要优势在于它可以长时间保持活动状态,避免了每次请求都需要启动新进程的开销,从而显著提升了网站的响应速度和并发处理能力。 在本文中,我们将详细讨论FastCGI以及如何在IIS6上安装和使用FastCGI 1.5...

    Java的FastCGI网关 jFastCGI

    通过使用jFastCGI,开发者可以利用FastCGI的优势,提高动态网站的响应速度和并发处理能力,同时保持Java的灵活性和强大的生态系统。在Java开发中,jFastCGI是一个值得考虑的工具,特别是对于那些需要在高性能环境中...

    FastCGI For IIS6.0

    由于FastCGI进程持续存在,减少了启动和关闭进程的开销,因此在处理高并发请求时表现得更为稳定。此外,FastCGI还支持多进程模型,可以根据服务器资源和需求灵活调整进程数量,进一步优化性能。 总的来说,FastCGI ...

    Fastcgi 中文参考手册(DOC)

    2. **多进程模型**:FastCGI 应用程序可以同时处理多个请求,通过进程池管理多个进程,提高了并发处理能力。 3. **语言无关性**:FastCGI 支持多种编程语言,如 C、Perl、Python、PHP 等,使得开发者可以选择最适合...

    FastCGI手册

    - **短生存期应用程序(CGI)**:传统的CGI技术对于每一次HTTP请求都会创建一个新的进程来处理,这种方式在处理大量并发请求时会导致服务器资源迅速耗尽。 - **长生存期应用程序(FastCGI)**:FastCGI允许程序持久...

    用VC++开发FastCGI+MySQL的基本源代码

    8. **内存管理**:由于FastCGI应用程序可能需要处理大量的并发请求,所以合理的内存管理对于性能和稳定性至关重要。理解何时分配和释放内存,避免内存泄漏,是开发中的关键点。 9. **多线程编程**:根据FastCGI的...

    fastcgi头文件和库

    总的来说,FastCGI头文件和库是构建高性能Web服务基础设施的关键组件,它们为开发者提供了高效地与Web服务器交互的能力,使得Web应用能够快速、稳定地处理大量并发请求。了解并熟练运用这些资源对于开发高性能的Web...

    Fastcgi 中文参考手册(DOC).rar

    而FastCGI则通过维持一个常驻内存的进程池,可以复用这些进程,显著提升了响应速度和服务器的并发处理能力。 FastCGI的工作原理可以概括为以下几点: 1. **持久连接**:FastCGI进程在服务器启动时就创建,可以处理...

    nginx-1.14.0.zip_nginx fastcgi

    1. **性能优化**:可能包含了一些底层的性能优化,提高了并发处理能力。 2. **新功能**:可能添加了新的模块或功能,增强了Nginx的灵活性。 3. **安全增强**:可能修复了一些安全漏洞,增强了系统的安全性。 4. *...

    Go-gofast一个采用纯Go编写的FastCGI客户端库

    - 将Go应用作为FastCGI服务运行,利用Go的并发特性处理大量并发请求。 "Go-gofast-master"这个压缩包很可能是该项目的源代码仓库,包含所有相关的源文件、测试用例以及文档,这对于学习和理解"Go-gofast"的实现原理...

    mod-fastcgi-2.4.6 for apache2.40

    传统的CGI模式在处理每个HTTP请求时都会启动一个新的进程,这可能导致资源消耗过大,尤其是在高并发环境下。而FastCGI通过保持长期运行的进程来克服这个问题,这些进程可以重复使用,减少了每次请求时的初始化开销。...

    Nginx+VFP FASTCGI

    总结,Nginx+VFP FASTCGI的组合旨在利用Nginx的高效静态内容处理能力和VFP的数据库处理能力,通过FASTCGI协议在两者之间建立桥梁,提供动态Web服务。这种架构适用于需要在高并发环境下运行VFP应用的场景。

    fastcgi的一点资料

    FastCGI是一种进程管理器,旨在替代传统的CGI(Common Gateway Interface)模型,以克服CGI在处理大量并发请求时性能低下的问题。 ### FastCGI的优势 1. **持久连接**:FastCGI进程在服务器启动后一直运行,减少了...

    swift-PerfectFastCGI-Perfect的FastCGI服务器

    5. **异步处理**:Swift-PerfectFastCGI利用Swift的async/await语法,使开发者可以编写非阻塞的异步代码,以提高服务器的并发处理能力。 6. **数据库集成**:Perfect框架集成了多种数据库驱动,如SQLite、MySQL和...

    fastcgi安装文件

    - 易于扩展:可以轻松增加处理动态请求的FastCGI进程数量,以应对更多并发连接。 - 稳定性:单个进程崩溃不会影响其他进程,提供更高的系统稳定性。 7. **FastCGI与CGI的区别** - CGI(Common Gateway Interface...

    基于FastCGI的分布式集群WebGIS研究.pdf

    这些特点是通过减少单点故障、提高并发处理能力、以及增强系统的可维护性来实现的。 值得注意的是,构建此类WebGIS平台时,还需要关注数据安全、负载均衡、数据一致性、系统监控和故障恢复等方面的问题。数据安全...

    mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据

    - **mod_fastcgi**:适用于中等负载的应用场景,提供了更好的并发处理能力,但配置相对复杂。 - **php-fpm**:最适合高并发场景,具有良好的扩展性、灵活性和稳定性,是现代Web开发的首选方案。 #### 六、附录 **...

    安装windows 下 php7+nginx+fastcgi

    Nginx以其高效的并发处理能力、低内存占用和丰富的模块库而闻名。在本场景中,Nginx将作为Web服务器,接收HTTP请求并转发给FastCGI进程来处理PHP请求。 **FastCGI**是一种语言无关的、可伸缩架构的Web应用程序接口...

    fastcgi_4308

    例如,增加进程数可以提高并发处理能力,但过多的进程可能会消耗过多系统资源。因此,找到合适的平衡点至关重要。 5. **安全性**:配置FastCGI时,还需要注意安全问题,比如限制对敏感文件的访问,防止PHP脚本溢出...

    centos的nginx+php的fastcgi模式编译安装

    PHP-FPM(FastCGI Process Manager)是PHP的一个扩展,它允许Nginx通过FastCGI接口与PHP交互,提高PHP脚本处理速度。 3. **编译安装Nginx**: - 安装依赖:先确保系统中包含必要的编译工具和库,如`gcc`、`pcre`、...

Global site tag (gtag.js) - Google Analytics