Tipicamente il modo per farlo sarebbe usare un pool di thread e download in coda che emetterebbero un segnale, noto anche come evento, quando l'attività ha terminato l'elaborazione. Puoi farlo nell'ambito del modulo di threading fornito da Python.
Per eseguire tali azioni, utilizzerei gli oggetti evento e il modulo Queue .
Tuttavia, di seguito è possibile vedere una rapida e sporca dimostrazione di ciò che è possibile fare utilizzando una semplice threading.Thread
implementazione:
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()
Probabilmente avrebbe senso non sondare come sto facendo sopra. In tal caso, cambierei il codice in questo:
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()
Notare che qui non è impostato alcun flag daemon.
import threading, time; wait=lambda: time.sleep(2); t=threading.Thread(target=wait); t.start(); print('end')
). Speravo che "sfondo" implicasse anche distacco.