Python';s线程阻塞IO操作

Python';s线程阻塞IO操作,python,multithreading,python-2.7,io,Python,Multithreading,Python 2.7,Io,我有以下问题。每当子线程想要执行某些IO操作(写入文件、下载文件)时,程序就会挂起。在下面的示例中,程序挂起在opener.retrieve上。如果我执行python main.py,程序将被一个检索函数阻塞。如果我执行python./src/tmp.py一切正常。我不明白为什么。有人能解释一下发生了什么事吗 我在Linux系统(内核3.5.0-27)上使用python2.7 文件排序: main.py ./src __init__.py tmp.py main.py impo

我有以下问题。每当子线程想要执行某些IO操作(写入文件、下载文件)时,程序就会挂起。在下面的示例中,程序挂起在
opener.retrieve
上。如果我执行
python main.py
,程序将被一个检索函数阻塞。如果我执行
python./src/tmp.py
一切正常。我不明白为什么。有人能解释一下发生了什么事吗

我在Linux系统(内核3.5.0-27)上使用python2.7

文件排序:

main.py
./src
    __init__.py
    tmp.py
main.py

import src.tmp
tmp.py

import threading
import urllib

class DownloaderThread(threading.Thread):
    def __init__(self, pool_sema, i):
        threading.Thread.__init__(self)
        self.pool_sema  = pool_sema
        self.daemon     = True
        self.i = i

    def run(self):
        try:
            opener = urllib.FancyURLopener({}) 
            opener.retrieve("http://www.greenteapress.com/thinkpython/thinkCSpy.pdf", "/tmp/" + str(self.i) + ".pdf")
        finally:
            self.pool_sema.release()

class Downloader(object):
    def __init__(self):
        maxthreads             = 1
        self.pool_sema         = threading.BoundedSemaphore(value=maxthreads)

    def download_folder(self):
        for i in xrange(20):
            self.pool_sema.acquire()
            print "Downloading", i
            t = DownloaderThread(self.pool_sema,i)
            t.start()

d = Downloader()
d.download_folder()

我通过破解
urllib.py
使其正常工作-如果你检查它,你会看到许多
import
语句分散在代码中-也就是说,它使用“即时”导入内容,而不仅仅是在模块加载时

因此,真正的原因仍然未知——但不值得调查——可能是Python导入系统中出现了一些死锁。您不应该在导入过程中运行非平凡的代码,这只是自找麻烦

如果您坚持,如果您将所有这些奇怪的导入语句移到urllib.py的开头,就可以让它工作