>>> Viktor Massalogin wrote:
>>>> Is it possible to interrupt the server (paste.httpserver.serve) from 
>>>> WSGI
>>>> application? I tried to raise ServerExit, but 
>>>> ThreadPoolMixIn.handle_error()
>>>> does not stop the server.
>>> There's nothing very specific, I'm afraid, but probably 
>>> KeyboardInterrupt
>>> would work.
>>>
>>> --
>>> Ian Bicking : [EMAIL PROTECTED] : http://blog.ianbicking.org
>>>
>>
>> I have tried:
>> <pre>
>> def application( environ, start_response ):
>>     start_response('200 OK', [('Content-type', 'text/plain')])
>>     yield "Hello, world"
>>     #raise ServerExit
>>     raise KeyboardInterrupt
>> </pre>
>> but it seems that
>> ThreadPoolMixIn.process_request_in_thread() in httpserver.py
>> handles the exception:
>> <pre>
>> def handle_error(self, request, client_address):
>>     exc_class, exc, tb = sys.exc_info()
>>     if exc_class is ServerExit:
>>         # This is actually a request to stop the server
>>         raise
>>     return super(ThreadPoolMixIn, self).handle_error(request, 
>> client_address)
>>
>> def process_request_in_thread(self, request, client_address):
>>     """
>>     The worker thread should call back here to do the rest of the
>>     request processing. Error handling normaller done in 'handle_request'
>>     must be done here.
>>     """
>>     try:
>>         self.finish_request(request, client_address)
>>         self.close_request(request)
>>     except:
>>         self.handle_error(request, client_address)
>>         self.close_request(request)
>
> In trunk I've added code to re-raise KeyboardInterrupt specifically. Maybe 
> it'll work now?
>

It doesn't work,
because we need also re-raise KeyboardInterrupt in
ThreadPool::worker_thread_callback()
    ...
    try:
        runnable()
    except:
    ...

but all these exceptions are handled in
C:\Python25\Lib\threading.py
Thread::__bootstrap()
    ...
    try:
        self.run()
    except:
    ...

and do not come to serve()


Maybe we can stop server manually,
without exceptions,
adding
self.running = False
to this handler:

ThreadPoolMixIn.handle_error():
    exc_class, exc, tb = sys.exc_info()
    if exc_class is ServerExit:
        # This is actually a request to stop the server
        raise
    return super(ThreadPoolMixIn, self).handle_error(request, 
client_address)

?




_______________________________________________
Paste-users mailing list
[email protected]
http://webwareforpython.org/cgi-bin/mailman/listinfo/paste-users

Reply via email to