Nginx学习笔记(十六):worker进程的循环工作

本文详细介绍了Nginx服务器中worker进程的工作循环机制,深入理解worker如何处理请求和进行任务分配,有助于优化Nginx配置和提升服务器性能。
摘要由CSDN通过智能技术生成

前言


       上篇是在看ngx_worker_process_cycle()中的一个插曲,这篇继续,现在还不可能做到全知全解,只能随着源码的深入慢慢地了解。

worker进程循环工作


       Nginx采用信号的IPC方式对worker进程进行控制,其中的ngx_terminate、ngx_quit、ngx_repon都将由在ngx_signal_handler方法根据收到的信号进行处理。而信号的初始化都是在main()中的ngx_init_signals()中完成的。
       下面看源码吧:
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
    ngx_int_t worker = (intptr_t) data;

    ngx_uint_t         i;
    ngx_connection_t  *c;

	/* 从master进程继承过来的全局变量,设置其为worker进程 */
    ngx_process = NGX_PROCESS_WORKER;

	/* Worker进程初始化,下面详述 */
    ngx_worker_process_init(cycle, worker);

	/* 更改进程名字,这个很有意思...详见《笔记十五》 */
    ngx_setproctitle("worker process");

/* 针对worker子进程中的线程机制的,一般用不到,这里通过设置NGX_THREADS宏来开启 */
#if (NGX_THREADS)
    {
    ngx_int_t         n;
    ngx_err_t         err;
    ngx_core_conf_t  *ccf;

    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

    if (ngx_threads_n) {
        if (ngx_init_threads(ngx_threads_n, ccf->thread_stack_size, cycle)
            == NGX_ERROR)
        {
            /* fatal */
            exit(2);
        }

        err = ngx_thread_key_create(&ngx_core_tls_key);
        if (err != 0) {
            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
                          ngx_thread_key_create_n " failed");
            /* fatal */
            exit(2);
        }

        for (n = 0; n < ngx_threads_n; n++) {

            ngx_threads[n].cv = ngx_cond_init(cycle->log);

            if (ngx_threads[n].cv == NULL) {
                /* fatal */
                exit(2);
            }

            if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid,
                                  ngx_worker_thread_cycle,
                                  (void *) &ngx_threads[n], cycle->log)
                != 0)
            {
                /* fatal */
                exit(2);
            }
        }
    }
    }
#endif

	/* 这里Nginx是通过采用信号的方式,控制worker进程运行,具体的处理信号的方法
	 * 其实在main()函数中的ngx_init_signals()初始化工作中已经弄好,可以见signals[]数组中的
	 * ngx_signal_handler()处理函数,之后打算好好看看ngx_init_signals()这个函数
	 */

    for ( ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值