Normalmente, la forma de hacer esto sería usar un grupo de subprocesos y descargas en cola que emitirían una señal, también conocida como evento, cuando esa tarea haya terminado de procesarse. Puede hacer esto dentro del alcance del módulo de subprocesos que proporciona Python.
Para realizar dichas acciones, usaría objetos de eventos y el módulo Queue .
Sin embargo, a continuación se puede ver una demostración rápida y sucia de lo que puede hacer con una threading.Thread
implementación simple :
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()
Probablemente tendría sentido no sondear como lo estoy haciendo arriba. En cuyo caso, cambiaría el código a esto:
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()
Tenga en cuenta que no hay ningún indicador de demonio establecido aquí.
import threading, time; wait=lambda: time.sleep(2); t=threading.Thread(target=wait); t.start(); print('end')
). Tenía la esperanza de que "antecedentes" también implicara desapego.