Threaded server

Giampaolo Rodola' gnewsg at gmail.com
Mon Jan 14 07:56:52 EST 2008


On 14 Gen, 12:30, Nick Craig-Wood <n... at craig-wood.com> wrote:
> Giampaolo Rodola' <gne... at gmail.com> wrote:
> >  I'm trying to run an asynchronous FTP server I wrote into a thread for
> >  being able to run a test suite against it.
> >  The code below is the threaded FTP server code I'm using:
>
> >  class FTPd(threading.Thread):
>
> >      def __init__(self):
> >          self.active = False
> >          threading.Thread.__init__(self)
>
> >      def start(self, flag=None):
> >          assert not self.active
> >          self.flag = flag
> >          threading.Thread.start(self)
>
> >      def run(self):
> >          assert not self.active
> >          ftpd = ftpserver.FTPServer(address, ftp_handler)
> >          if self.flag:
> >              self.flag.set()
> >          self.active = True
> >          while self.active:
> >              ftpd.server_forever(timeout=1, count=1)
> >          ftpd.close()
>
> >      def stop(self):
> >          assert self.active
> >          self.active = False
>
> >  flag = threading.Event()
> >  ftpd = FTPd()
> >  ftpd.start(flag)
> >  flag.wait()  # wait for it to start
> >  unittest.main() # run the test suite
> >  ftpd.stop()
>
> >  Sometimes I get a strange error when all the tests have finished, the
> >  server is stopped and Python is exiting:
>
> >  Ran 50 tests in 1.515s
>
> >  OK
> >  Exception exceptions.TypeError: "'NoneType' object is not callable" in
> > <bound me
> >  thod FTPHandler.__del__ of <pyftpdlib.ftpserver.FTPHandler connected
> >  127.0.0.1:2
> >  249 at 0xa4b080>> ignored
> >  Exception exceptions.TypeError: "'NoneType' object is not callable" in
> > <bound me
> >  thod FTPServer.__del__ of <pyftpdlib.ftpserver.FTPServer listening
> >  127.0.0.1:543
> >  21 at 0x9e1a30>> ignored
>
> >  I sincerely don't know why that happens but it's likely because I'm
> >  not using threads properly.
> >  My concern is that this could be caused by a sort of race condition
> >  (e.g. Python tries to exit when ftpd.close call is not yet
> >  completed).
>
> It looks like when python is shutting down, it has removed an object
> the ftphandler code relies on.
>
> I see you attempt to kill the ftp server with ftpd.stop().  That is
> good, but you don't wait for the thread to finish (it might take up to
> a second in ftpd.server_forever if I understand correctly).
>
> I expect if you put a self.join() at the end of the stop() method the
> problem will go away.
>
> --
> Nick Craig-Wood <n... at craig-wood.com> --http://www.craig-wood.com/nick- Nascondi testo tra virgolette -
>
> - Mostra testo tra virgolette -

Tried it but the problem remains.
The strange thing is that it sometimes happens, sometimes doesn't.



More information about the Python-list mailing list