일반적으로이를 수행하는 방법은 작업이 처리를 완료했을 때 신호 (일명 이벤트)를 발행하는 스레드 풀 및 큐 다운로드를 사용하는 것입니다. 파이썬이 제공 하는 스레딩 모듈 의 범위 내에서이를 수행 할 수 있습니다 .
이 작업을 수행하기 위해 이벤트 객체 와 Queue 모듈을 사용 합니다.
그러나 간단한 threading.Thread
구현을 사용하여 수행 할 수있는 작업에 대한 빠르고 더러운 데모는 아래에서 볼 수 있습니다.
import os
import threading
import time
import urllib2
class ImageDownloader(threading.Thread):
def __init__(self, function_that_downloads):
threading.Thread.__init__(self)
self.runnable = function_that_downloads
self.daemon = True
def run(self):
self.runnable()
def downloads():
with open('somefile.html', 'w+') as f:
try:
f.write(urllib2.urlopen('http://google.com').read())
except urllib2.HTTPError:
f.write('sorry no dice')
print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
while not os.path.exists('somefile.html'):
print 'i am executing but the thread has started to download'
time.sleep(1)
print 'look ma, thread is not alive: ', thread.is_alive()
위에서하는 것처럼 설문 조사를하지 않는 것이 이치에 맞을 것입니다. 이 경우 코드를 다음과 같이 변경합니다.
import os
import threading
import time
import urllib2
class ImageDownloader(threading.Thread):
def __init__(self, function_that_downloads):
threading.Thread.__init__(self)
self.runnable = function_that_downloads
def run(self):
self.runnable()
def downloads():
with open('somefile.html', 'w+') as f:
try:
f.write(urllib2.urlopen('http://google.com').read())
except urllib2.HTTPError:
f.write('sorry no dice')
print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
thread.join()
여기에는 데몬 플래그가 설정되어 있지 않습니다.
import threading, time; wait=lambda: time.sleep(2); t=threading.Thread(target=wait); t.start(); print('end')
). 나는 "배경"도 분리되어 있기를 바라고 있었다.