Event-driven handler

Eugaia eugaia at gmail.com
Wed Feb 18 20:25:09 MSK 2009


> Be aware that Nginx does not support threads, and it is not thread safe.
> Of course you can create and manage your threads, but that's not easy.
Thanks, yes I am aware - and I'll be handling the thread stuff myself.
> What do you mean by "some event-driven system"?
I'm talking about how I'll generate my content here - it's irrelevant to 
my question about Nginx.
>> and tells Nginx to wait until output has been generated
>
> This is easy.
> You just have to return NGX_DONE from the handler, and call 
> ngx_http_finalize_request when done.
This may be what I need to know.  If I return NGX_DONE, is the request 
the response then not automatically
sent to the client?  In order to do that, you need to call 
ngx_http_finalize_request. Is that right?

What about if I want to use filters after my content has been 
generated?  E.g. gzip.  At the moment, my
code calls ngx_http_output_filter in my handler and returning the 
response from that.

Should I instead do something like:

[my handler]
- sends request to my output-generating code (which may be in its own 
new thread)
- immediately returns NGX_DONE (which then sends no response to the client)

[my output-generating code]
- generates output (e.g. in its own thread)
- returns ngx_http_output_filter(...) (if wanting to continue using filters)
- returns ngx_http_finalize_request(...) (if don't want to use any filters)

Does this sound right, or have I mis-understood what you wrote?
> You may be interested in my mod_wsgi code (ngx_http_wsgix_handler.c) 
> code for more details
> http://hg.mperillo.ath.cx/nginx/mod_wsgi/file/tip/src/ngx_http_wsgi_handler.c 
>
Thanks, I'll check it out.
>> (4) Output is generated in 'background' whilst Nginx is handling 
>> other requests
>
> This, again, *may* be easy (if you don't use threads, of course).
>
>> (5) Message is sent to Nginx that content has been generated through 
>> some event
>> (e.g. with a semaphore)
If I've understood your comments above, then this notification actually 
isn't necessary -
you just call ngx_http_finalize_request (or ngx_http_output_filter?) 
when you're done.

I was thinking that a response was automatically sent when you returned 
from your handler.
> If you can refactor you code, I suggest to execute the computation by 
> steps.
That's not really practical for what I'm doing - there's no guarantee 
that the code can be executed quickly.
> Of course if the codes involves some IO, this may be tricky.
> But you can use the Nginx event module to receive IO notifications.
Could you possibly give me an example?

Thanks,

Marcus.





More information about the nginx mailing list