On 2009-03-11 19:02:26 +0000, Falcolas <garri...@gmail.com> said:

On Mar 11, 12:28 pm, David George wrote:
On 2009-03-11 04:36:29 +0000, "Mark Tolonen" <metolone+gm...@gmail.com> s
aid:





"David George" <d...@eatmyhat.co.uk> wrote in message
news:00150e67$0$27956$c3e8...@news.astraweb.com...
Hi guys,

I've been developing some code for a university project using Python.
We've been working on an existing codebase, cleaning it up and removin
g
dead wood.

We decided to make some changes to internal message handling by using
a
SocketServer, which worked great when we were using 2.6, as we could
simply call its shutdown() method when we wanted to stop it from
'serving forever'.

Unfortunately, we've now needed to downgrade to python 2.5 to
accomodate the libtorrent python bindings we need to use as part of th
e
project.

So, my question is, is there any way to stop a SocketServer that's bee
n
told to server forever in python 2.5?

Sure, derive a class from one of the classes in SocketServer, and
override the methods that implement the shutdown behavior in 2.6.

-Mark

Based on what you guys have said i've had a look at the code for
serve_forever() in both 2.5 and 2.6, and tried to create my own derived
class in this manner:

class MBThreadingTCPServer(SocketServer.ThreadingTCPServer):

    def __init__(self, address_tuple, handler):
        SocketServer.ThreadingTCPServer.__init__(self, address_tu
ple, handler)
        self.__serving = True

    def serve_forever(self):
        while self.__serving:
            SocketServer.ThreadingTCPServer.handle_request(se
lf)

    def shutdown(self):
        self.__serving = False

Don't worry about the MB thing, it's just related to the name of our proj
ect.

I don't think i've done this right, but i've tried to implement the
serve_forever() functionality in my derived class, and also add the
shutdown() method so i can stop it.

Does this appear to be the right way to do things?

Cheers,

Dave

More or less what I would do, though you should be able to call
self.handle_request. It's worth noting that handle_request generally
calls a blocking socket method, which means your self.__serving check
only happens the next time it handles a request.

~G

Yes, i've just noticed that this is the problem ... i've updated the code to work like this:

class MBTCPServer(SocketServer.TCPServer):

   def serve_until_stopped(self):
       self.serving = True
       self.has_shutdown = False
       while self.serving:
           self.handle_request()
       self.has_shutdown = True

   def shutdown(self):
       self.serving = False

Simply calling the base class constructor when i build it (i believe this is inferred).

Again, problem here is the issue of being unable to kill the server while it's waiting on a request. In theory, i could force it to continue by sending some sort of junk data with the method i use to stop the server, but that seems a bit hacky, don't you think?

Cheers,

Dave

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to