2013-04-18 1 views
0

다음과 같은 문제가 있습니다. 자식 스레드가 IO 작업 (파일 쓰기, 파일 다운로드)을 수행하려고 할 때마다 프로그램이 중단됩니다. 다음 예제에서 프로그램은 opener.retrieve에 있습니다. python main.py을 실행하면 프로그램이 검색 기능에서 차단됩니다. python ./src/tmp.py을 실행하면 모든 문제가 해결됩니다. 나는 왜 그런지 이해하지 못한다. 아무도 내게 무슨 일이 일어 났는지 설명 할 수 있니?IO 작업시 Python의 스레드가 차단됩니다.

리눅스 시스템 (커널 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() 

답변

0

가 나는 urllib.py 해킹에 의해 작동하도록 관리 많은 import 문장이 코드 내에 분산되어 있습니다. 즉, 즉석에서 가져 오기 작업을 사용합니다. '모듈이로드 될 때가 아닙니다.

따라서 이유는 아직 알려지지 않았지만 조사 할 가치가 없습니다. 파이썬의 가져 오기 시스템에서 일부 교착 상태가 발생할 수 있습니다. import 중에 중요한 코드를 실행해서는 안됩니다. 단지 문제를 묻는 것입니다.

당신이 주장한다면,이 모든 이상한 import 문을 urllib.py의 시작 부분으로 옮기면 작동하게 할 수 있습니다.

관련 문제