다음과 같은 문제가 있습니다. 자식 스레드가 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()