ngixn进程数 什么是nginx进程 是干什么????

本文介绍了 Nginx 的多进程模型,包括监控进程和工作进程的职责分配,以及如何通过信号处理机制实现进程间的通信和协调。详细解释了主进程如何监控子进程的状态,并在必要时采取行动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx 进程模型

    nginx的进程模型和大多数后台服务程序一样,按职责将进程分成监控进程和工作进程两类,启动nginx的主进程充当监控进程,而由主进程fork出来的子进程则充当工作进程。工作进程的任务自然是完成具体的业务逻辑,而监控进程充当整个进程组的对外接口,同时对工作进程进行监护,比如如果某工作进程意外退出,监控进程将重新fork生成一个新的工作进程。nginx也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,此时没有监控进程,单进程模型比较简单且官方建议仅供测试使用,所以下面主要分析多进程模型。

     nginx多进程模型的入口函数为主进程的 ngx_master_process_cycle(), 在该函数内做完信号处理,设置等之后就会调用 ngx_start_worker_processes(),用于fork()创建子进程(子进程的数目通过ccf->worker_processes指定),子进程作为一个新的实体,开始充当工作者的角色运行ngx_worker_process_cycle()函数, 该函数实体为一个无限的for循环,持续不断的处理客户端的服务请求,而主进程继续执行ngx_master_process_cycle(),也就是监控子进程的for循环,主进程也是一个无限for循环,直到进程退出,才会退出循环.

          

nginx 进程流程图

       监控进程的无限for循环内的有一个关键的函数sigsuspend()函数调用,该函数的调用使得监控进程的大部分时间处于挂起等待状态,直到监控进程接收到信号为止,当监控进程接收到信号时,信号处理函数ngx_signal_handler()就会被执行.信号处理函数执行的主要动作就是根据当前信号值相对应的旗标变量做设置,而实际的处理逻辑必须放在主体代码里来处理,所以该for循环接下来的代码就是判断有哪些旗标变量被设置而需要处理的,比如ngx_reap(有子进程退出),ngx_quit或ngx_terminate(进程要退出或中止,2个旗标都是表示推出nginx,但ngx_quit更优雅,它会让nginx监控进程做一些清理工作且等待子进程也完全清理并退出之后才终止,而ngx_terminate更为粗暴,不过它通过使用SIGKILL信号能保证在一段时间后必定被结束掉),ngx_reconfigure(重新加载配置)等.当所有的信号都处理完以后又挂起在函数sigsuspend()调用处继续等待新的信号,如此反复.

 

构成监控进程的主要执行体

 

复制代码
void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{
       .....
       //初始话子进程
       ngx_start_worker_processes(cycle, ccf->worker_processes,
                               NGX_PROCESS_RESPAWN);
       ngx_start_cache_manager_processes(cycle, 0);
       .....
       for ( ; ; ) {
            if (delay) {
            }
        .....
        sigsuspend(&set);//挂起主进程,等待信号
        .....
        if (ngx_reap) {  //子进程退出
        }     
        .....
       if (!live && (ngx_terminate || ngx_quit)) {  
       }
       .......
        if (ngx_terminate) {
        }  //exit  nginx
        .....
        if (ngx_quit){
        }
        .....
        if (ngx_reconfigure) {
        }
        .....
        if (ngx_restart) {
        }
        .....
        if (ngx_reopen) {
        }
 
}       
   
复制代码
复制代码
信号的数据结构
typedef struct {
    int     signo;  //信号值
    char   *signame; 
    char   *name;
    void  (*handler)(int signo);  //信号的处理函数
} ngx_signal_t;
复制代码
复制代码
//信号数组
ngx_signal_t  signals[] = {
    { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
      "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
      "reload",
      ngx_signal_handler },

    { ngx_signal_value(NGX_REOPEN_SIGNAL),
      "SIG" ngx_value(NGX_REOPEN_SIGNAL),
      "reopen",
      ngx_signal_handler },
     ......
}
复制代码
复制代码
//获得信号后的处理函数
void
ngx_signal_handler(int signo)
{
     ....
     switch (ngx_process) {

    case NGX_PROCESS_MASTER:
    case NGX_PROCESS_SINGLE:
        switch (signo) {

        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):
            ngx_quit = 1;  //将ngx_quit设置为1,将执行主进程中if(ngx_quit)下的程序
            action = ", shutting down";
            break;
           .....
         }
     }
}
复制代码

    工作进程的执行主题与监控进程类似,那么它的主要关注点就是与客户端或后端真实服务器(此时nginx为中间代理)之间的数据可读/可写等交互事件,而不是进程信号,所以工组进程的阻塞点在select,epoll等这样的I/O多路复用的函数调用处,以等待发生数据可读/可写事件,当然,也可能被新接收到的信号中断.

ngx_process_cycle.c中的工作进程的函数主体 :

     

复制代码
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{ 
        ......
        ngx_worker_process_init(cycle, 1);
        ......
         for ( ;; ) {

         if (ngx_exiting) {
         }
         .........
         ngx_process_events_and_timers(cycle);
         
         if (ngx_terminate) {}
         ........
         if (ngx_quit) {}
         ........  
          if (ngx_reopen) {}
}
复制代码

 

<think>好的,用户现在问的是Tornado是干什么用的。之前他们已经问过MySQL和Redis的区别,现在转向了另一个技术,Tornado。我需要先回想一下Tornado的主要功能和特点。 用户可能对不同的后端技术不太清楚,所以需要明确Tornado的定位。首先,用户可能想知道Tornado与其他框架(比如Flask或Django)的区别,或者它适合什么场景。他们可能是在选择技术栈时遇到了困惑,或者在学习过程中遇到了这个框架。 接下来,我要确定Tornado的核心特点。Tornado是一个Python的异步网络框架,同时也是一个Web服务器。它的主要优势在于处理高并发和长连接,比如WebSocket。这跟之前的MySQL和Redis不同,后者是数据库,而Tornado属于应用层框架。 用户可能不太清楚异步和非阻塞的概念,需要简单解释。同时,需要举例说明使用场景,比如实时应用、高并发请求处理等。此外,用户可能关心它和其他框架的对比,比如和Django相比有什么优势或劣势。 还要注意用户可能的背景。如果他们是开发者,可能需要技术细节,比如异步I/O、事件循环机制;如果是初学者,可能需要更简明的解释。根据之前的回答,用户得到的是结构化的对比,所以这次也应该保持清晰的层次结构,比如分点说明核心定位、主要功能、使用场景等。 另外,用户可能想知道什么时候该选择Tornado而不是其他框架。比如,在需要处理大量并发连接时,或者需要WebSocket支持时,Tornado更合适。而如果是传统的CRUD应用,可能Django或Flask更适合。 最后,确保回答符合之前设定的格式要求:使用中文,结构清晰,分点说明,可能包括对比和示例场景。还要检查是否有需要纠正的常见误解,比如Tornado不仅仅是一个Web框架,还包括HTTP服务器。</think>Tornado 是一个基于 Python 的 **异步网络框架和 Web 服务器**,核心设计目标是处理高并发和长连接场景。以下是详细说明: --- ### 一、核心定位 1. **异步非阻塞 I/O 模型** - 通过单线程事件循环(Event Loop)实现高并发,避免传统多线程/多进程的资源开销。 - 适合处理大量同时活跃的连接(如实时聊天、推送服务)。 2. **轻量级 Web 框架** - 提供路由、模板渲染、Cookie 处理等基础功能,适合构建高性能 API 或简单 Web 应用。 3. **内置 HTTP 服务器** - 直接运行 Tornado 即可启动服务,无需依赖 Nginx 或 Gunicorn(但生产环境通常配合反向代理使用)。 --- ### 二、主要功能与特性 | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **异步网络库** | 支持异步 HTTP 客户端/服务器、WebSocket 协议,适合实时通信(如在线游戏、股票行情推送)。 | | **高性能并发** | 单线程可处理数千并发连接,资源占用低(对比传统同步框架如 Django、Flask)。 | | **非阻塞操作** | 异步处理数据库查询、外部 API 调用等 I/O 操作,避免阻塞主线程。 | | **长轮询与流式响应** | 支持 Comet 长轮询和分块传输(Chunked Response),适用于实时数据推送。 | --- ### 三、典型应用场景 1. **实时 Web 服务** - **WebSocket 应用**:在线聊天室、多人协作编辑工具、实时监控仪表盘。 - **示例**:客户端与服务端保持长连接,通过 `Tornado.websocket.WebSocketHandler` 双向通信。 2. **高并发 API 服务** - 处理大量短期 HTTP 请求(如秒杀系统的请求分发层)。 - **对比同步框架**:Tornado 异步模型可避免线程池耗尽导致的请求堆积。 3. **代理与中间件** - 作为反向代理或中间层,聚合多个后端服务的响应(利用异步特性并行调用外部接口)。 4. **定时任务与后台服务** - 通过 `AsyncIOMainLoop` 结合异步库(如 `asyncio`)实现定时任务调度。 --- ### 四、与其他 Python 框架对比 | 框架 | 类型 | 并发模型 | 适用场景 | |-----------|------------|----------------|-----------------------------------| | **Tornado** | 异步框架 | 单线程事件循环 | 高并发、长连接、实时通信 | | **Django** | 同步框架 | 多线程/多进程 | 复杂业务系统(如 CMS、电商后台) | | **Flask** | 微框架 | 同步 | 轻量级 REST API 或小型 Web 应用 | | **FastAPI** | 异步框架 | 基于 ASGI | 高性能 API(依赖异步驱动库) | --- ### 五、代码示例 ```python import tornado.ioloop import tornado.web # 1. 定义异步请求处理器 class MainHandler(tornado.web.RequestHandler): async def get(self): self.write("Hello, Tornado!") # 2. 配置路由 def make_app(): return tornado.web.Application([(r"/", MainHandler)]) # 3. 启动服务 if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` --- ### 六、总结 - **核心优势**:异步非阻塞、高并发支持、轻量级。 - **适用场景**:实时通信、高频短请求、长连接服务。 - **局限性**: - 不适合 CPU 密集型任务(异步模型无法加速计算)。 - 生态不如 Django 丰富(插件和 ORM 支持较少)。 - **选型建议**: - 需要 WebSocket 或高并发 → **Tornado** - 需要快速开发复杂业务 → **Django** - 简单 API 或微服务 → **Flask/FastAPI**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值