我想要将 数据处理部分从 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 的,如果我想要我的模块工作正常,我应该怎么修改我的代码呢?
有几个问题?
1)现在是因为count = 0?还是访问pArg->r->main->count程序coredump?
2)ngx_http_finalize_request(r, NGX_DONE); 这个是在什么时候调用的,在你handle结束的时候?还是扔给你的线程池就调用了?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。