开发者社区> 问答> 正文

Nginx模块,想实现个异步处理的功能,但 Nginx 报错

我想要将 数据处理部分从 nginx 的数据接收流程独立出来,
交由单独的线程池来做,等线程池运算完毕后,再返回。
但在这个过程中,我碰到一些问题,希望能获得您的帮助,我的问题如下:

1 首先我在 static ngx_int_t ngx_http_my_init_handler(ngx_http_request_t *r) 中 注册了POST数据处理handle
ngx_http_read_client_request_body(r, ngx_my_read_body_handler);

2 我在 ngx_my_read_body_handler(ngx_http_request_t *r) 中 读取到所有的 body 数据
然后: r->main->count++;

           ngx_http_finalize_request(r, NGX_DONE);

然后分配线程参数内存pArg,保存:r 以及 body数据,然后将它们投入到线程池中。
然后 return;

3 在我的线程工作函数 work(pArg) 中:
首先 我处理数据:ngx_uint_t status = do_my_business(pArg->r, pArg->body_buf, pArg->body_len);
然后:

           printf(" ---- befor ngx_http_finalize_request, r = %p, body_buf = %p, body_len = %ld, count = %d\n",
                             pArg->r, pArg->body_buf, pArg->body_len, pArg->r->main->count);

           pArg->r->headers_out.status = status;
           pArg->r->header_only = 1;
           pArg->r->headers_out.content_length_n = 0;
           ngx_http_finalize_request( pArg->r, ngx_http_send_header(pArg->r) );
           return;    线程工作函数结束

我的问题是:少量的请求这个流程没有问题,可以跑通,但是请求数上来后,我发现 在 printf 输出中:pArg->r->main->count == 0
一旦 pArg->r->main->count == 0 时 Nginx 就异常了。正常的情况下,这个值应该为1。

我不知道是什么机制在什么时候将这个 count 置 0 的,如果我想要我的模块工作正常,我应该怎么修改我的代码呢?

展开
收起
yangyuqi_sohu 2016-11-07 19:55:18 2716 0
2 条回答
写回答
取消 提交回答
  • 线程工作函数最后

    2019-07-17 20:23:29
    赞同 展开评论 打赏
  • 有几个问题?
    1)现在是因为count = 0?还是访问pArg->r->main->count程序coredump?
    2)ngx_http_finalize_request(r, NGX_DONE); 这个是在什么时候调用的,在你handle结束的时候?还是扔给你的线程池就调用了?

    2019-07-17 20:23:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《Nginx 代理系统常用手册》 立即下载
CentOS Nginx PHP JAVA 多语言镜像使用手 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载