Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to quit an asyncore dispatcher from a handler?

I couldn't find this in the docs, but how am I meant to break out of the asyncore.loop() without using signals?

like image 578
gak Avatar asked May 07 '12 22:05

gak


2 Answers

That was quick to work out after looking at the source code. Thanks to the docs for linking directly to the source!

There is an ExitNow exception you can simply raise from the app, which exits the loop.

Using the EchoHandler example from the docs, I've modified it to quit immediately when receiving data.

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        if data:
            raise asyncore.ExitNow('Server is quitting!')

Also, keep in mind that you can catch ExitNow so your app doesn't raise if you're using it internally. This is some of my source:

def run(config):
    instance = LockServer(config)
    try:
        asyncore.loop()
    except asyncore.ExitNow, e:
        print e
like image 144
gak Avatar answered Sep 18 '22 13:09

gak


The asyncore loop also quits when there are no connections left, so you could just close the connection. If you have multiple connections going on then you can use asyncore.close_all().

like image 25
andy_js Avatar answered Sep 18 '22 13:09

andy_js