Using thread in an asyncronous application

Aaron Brady castironpi at gmail.com
Sat Nov 29 21:24:09 EST 2008


On Nov 29, 5:27 am, "Giampaolo Rodola'" <gne... at gmail.com> wrote:
> On 29 Nov, 02:24, Aaron Brady <castiro... at gmail.com> wrote:
>
>
>
> > On Nov 27, 9:03 am, "Giampaolo Rodola'" <gne... at gmail.com> wrote:
>
> > > Hi,
> > > I'm the maintainer of an asynchronous FTP server implementation based
> > > on asyncore.
> > > Some days ago I thought it would be interesting to add a class
> > > offering the possibility to run the asyncore loop into a thread so
> > > that a user can run the server without blocking the entire
> > > application.
> > > It could be useful, for example, in case someone wants to integrate a
> > > GUI.
>
> > > Since I'm not good with multi-threaded programming I'd like some
> > > opinions about the code I'm going to paste below.
>
> > > The FTPServer class that I inherited in my subclass is the
> > > "dispatcher" which listens on port 21 dispatching the incoming
> > > connection to an "handler".
> > > The polling loop (FTPServer.serve_forever()) is wrapped in the run
> > > method.
> > > As you can see I acquire and release the lock (threading.Lock) every
> > > time I call the polling loop.
> > > My question is: is that really necessary?
> > > Should I expect some weird behavior by running the main loop into a
> > > thread like I did?
>
> > > Thanks in advance
>
> > I found it hard to read through it.  Do you have a smaller abstract
> > example?- Nascondi testo citato
>
> > - Mostra testo citato -
>
> Yeah, sure. I removed all the confusing stuff. Though I didn't tried
> it it should work:
>
> class ThreadedFTPServer(FTPServer, threading.Thread):
>
>     def __init__(self, address, handler):
>         FTPServer.__init__(self, address, handler)
>         threading.Thread.__init__(self)
>         self.__serving = False
>
>     def start(self):
>         threading.Thread.start(self)
>
>     def run(self):
>         self.__serving = True
>         while self.__serving:
>             self.__lock.acquire()
>             FTPServer.serve_forever(self, timeout=1, count=1)
>             self.__lock.release()
>         FTPServer.close_all(self, ignore_all=True)
>
>     def stop(self):
>         if not self.__serving:
>             raise RuntimeError("Server not started yet")
>         self.__serving = False
>         self.join()
>
> --- Giampaolohttp://code.google.com/p/pyftpdlib/

Well I'm just one person, but I like it.  Not sure if you want double-
underscores on your variable names.  And not sure you have to override
'start' just to call the base method... does FTPServer have a 'start'
method?  How do you resolve those in general... setting the MRO?
Setting the method to the base method, 'start= threading.Thread.start'?



More information about the Python-list mailing list