import threading
import Queue
import urllib2
import time
class ThreadURL(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
host = self.queue.get()
sock = urllib2.urlopen(host)
data = sock.read()
self.queue.task_done()
hosts = ['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com', 'http://stackoverflow.com']
start = time.time()
def main():
queue = Queue.Queue()
for i in range(len(hosts)):
t = ThreadURL(queue)
t.start()
for host in hosts:
queue.put(host)
queue.join()
if __name__ == '__main__':
main()
print 'Elapsed time: {0}'.format(time.time() - start)
Ho cercato di capire come eseguire il threading e dopo alcuni tutorial, ho scoperto quanto sopra.Ho bisogno di assistenza con il threading/coda Python
Che si suppone di fare è:
- Initialiase coda
- creare la mia piscina filo e poi in coda l'elenco di host
- La mia classe ThreadURL dovrebbe poi iniziare a lavorare una volta che un host è in la coda e leggere i dati del sito web
- il programma dovrebbe terminare
Quello che voglio sapere in primo luogo fuori, ovvero un m lo faccio correttamente? È questo il modo migliore per gestire i thread?
In secondo luogo, il mio programma non riesce ad uscire. Stampa la riga Elapsed time
e quindi si blocca lì. Devo uccidere il mio terminale per farlo andare via. Suppongo che ciò sia dovuto al mio errato utilizzo di queue.join()
?
Ho usato la coda perché è quello che la maggior parte degli esempi/tutorial che ho letto stavano usando. Perché una coda è utile solo quando si inviano dati tra thread? L'unica informazione che ho trovato su threading/accodamento era tutorial (che mostravano codice e non molte informazioni) e documenti ufficiali che erano troppo complessi per me, un principiante di threading, per capire. – dave
se si sta avviando un solo thread per host, va bene rinunciare alle code e passare un singolo host a __init __(). ma considera il caso in cui hai un ampio elenco di host che vuoi alimentare con un numero limitato di thread. useresti una coda per distribuire il lavoro. –