[dev] threads support in nginx

Manlio Perillo manlio_perillo at libero.it
Mon Sep 17 00:02:27 MSD 2007


Igor Sysoev ha scritto:
> On Sun, Sep 16, 2007 at 08:51:20PM +0200, Manlio Perillo wrote:
> 
>> Since mod_wsgi is almost ready, I have to find the best way to not block 
>>  nginx when running a WSGI application.
>>
>> There are two solutions:
>> 1) Implements a Python module for accessing the nginx event module, so
>>    that the application can do asynchronous programming
>> 2) Use threads
>>
>>
>> The second solution is, unfortunately (I do not like threads) the only 
>> way to support existing applications.
> 
> This is why I said that python, like perl, etc. is not suitable
> language to embed to the event-driven servers such as nginx.
> 

The problem is not with Python or Perl, but with application programming.

It is true that interpreted languages are slower then C, but usually 
this is not a problem (as an example, Mercurial is written in Python and 
it is "fast").

>> I'm reading the nginx threads support code and, as far as I can understand:
>> - to execute a job in a separate thread, a module can post an event to
>>   a worker thread
>> - the code that runs in the separate thread can access the nginx
>>   "internals", since these are protected using a mutex
>>
>>
>> However there is an alternate method to support threads, and it is the 
>> solution adopted by Twisted (an asynchronous framework written in 
>> Python): when a code that runs in a separate thread needs to access 
>> shared code, it posts back a new event[1] to the main thread.
>>
>> This solution has the great advantage to simplify the implementation of 
>> thread safe code, since this code is limited to a well defined place, 
>> and the rest of the framework can safely be thread unsafe.
>>
>> Igor, is this solution applicable to nginx?
> 
> Now the thread support is broken in nginx. They requires rethinking
> and locking in various places.
> 
> The threads are not intended to run whole request in one thread.
> The request in his life time may be handled by various threads.
> 


With the Twisted model, here is how I can handle a blocking code that 
produce data (pseudo code):


def handler(request):
    # execute the blocking function is a separate thread
    callInThread(handler_thread, request)
    return # return control to the reactor

def handler_thread(request):
    while True:
       data = slow_read()
       # execute unsafe code in the main thread
       callFromThread(handler_write, request, data)
       ...

    callFromThread(request_finish, request)

def handler_write(request, data):
    request.write(data)

def request_finish(request):
    request.finish()



The problem with nginx, if I'm right, is that request.write can return a 
NGX_AGAIN.


Its infortunate that with nginx it is not possible to use this simple 
pattern.



Thanks and regards   Manlio Perillo





More information about the nginx mailing list