threading+ftp+import => block

Damjan gdamjan at gmail.com
Tue Jul 25 20:21:36 EDT 2006


Damjan wrote:

> Panard wrote:
> 
>> Hi,
>> I'm experiencing a strange problem while trying to manage a ftp
>> connection into a separate thread.
>> 
>> I'm on linux, python 2.4.3
>> 
>> Here is a test :
>> ------ ftp_thread.py ------
>> import ftplib
>> import threading
>> import datetime
>> 
>> class test( threading.Thread ) :
>>         ftp_conn = ftplib.FTP("localhost","user","pass")
>>         def run( self ) :
>>                 print self.ftp_conn.pwd()
>>                 self.ftp_conn.dir("/")
>>                 print datetime.date.today()
>> def t() :
>>         t = test()
>>         t.start()
>>         t.join()
>> t()
>> -------
>> 
>> If I do :
>> $ python ftp_thread.py
>> /
>> drwxrwsr-x   2 panard   ftp          4096 Jul 24 12:48 archives
>> 2006-07-24
>> ==> Works perfectly
>> 
>> But :
>> $ python
>>>>> import ftp_thread
>> /
>> <program block>
> 
> This has been documented in the blog posts titled "How well you know
> Python" (find it on google)
> 
> The problem is that, once you run "import ftp_thread" a lock is set in the
> Python interpreter, so then you can't start a new thread... (this from the
> back of my mind).

Actually, testing with
class test( threading.Thread ) :
    def run( self ) :
        print 'Hello'

instead of your test class, didn't show this anomally... actually the
problem is that "import ftp_thread" sets a lock on *importing* other
modules and I thing that the call to "self.ftp_conn.dir("/")" deep down in
the ftplib module tries to "import re" and that's where it hangs.

You could try to move the "import re" in ftplib to the top of the module,
and submit a patch to the Python bug system.



Here's a simpler test class that hangs:

import threading
class test(threading.Thread):
    import string
    print 'Step one'
    def run(self):
        import re
        print 'Hangs before this when this file is imported'

def t() :
    t = test()
    t.start()
    t.join()
t()



-- 
damjan



More information about the Python-list mailing list