¿Necesitas ayuda con los hilos / cola de Python?

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) 

He estado tratando de entender cómo realizar el subprocesamiento y, después de algunos tutoriales, he encontrado lo anterior.

Lo que se supone que debe hacer es:

  1. Inicializar la cola
  2. Crear mi grupo de subprocesos y luego poner en cola la lista de hosts
  3. Mi clase ThreadURL debería comenzar a funcionar una vez que un host esté en la cola y leer los datos del sitio web
  4. El progtwig debe terminar

Lo primero que quiero saber es, ¿estoy haciendo esto correctamente? ¿Es esta la mejor manera de manejar hilos?

En segundo lugar, mi progtwig no puede salir. Imprime la línea de Elapsed time y luego se cuelga allí. Tengo que matar mi terminal para que se vaya. Supongo que esto se debe a mi uso incorrecto de queue.join() ?

Tu código se ve bien y está bastante limpio.

La razón por la que su aplicación aún se “cuelga” es que los subprocesos de trabajo aún se están ejecutando, esperando que la aplicación principal ponga algo en la cola, incluso aunque su subproceso principal esté terminado.

La forma más sencilla de solucionar este problema es marcar los subprocesos como demonios, haciendo t.daemon = True antes de que comience la llamada. De esta manera, los hilos no bloquearán la parada del progtwig.

Se ve bien. Yann tiene razón sobre la sugerencia del demonio. que va a arreglar su caída. mi única pregunta es ¿por qué usar la cola en absoluto? no estás haciendo ninguna comunicación entre hilos, por lo que parece que puedes enviar la información del host como argumento a ThreadURL init () y eliminar la cola.

No hay nada de malo en eso, solo me lo pregunto.

Una cosa, en la función de ejecución de subprocesos, mientras que el bucle verdadero, si se produce alguna excepción, puede que no se llame a task_done (), sin embargo, ya se ha llamado a get (). Por lo tanto, la cola.join () nunca puede terminar.