2011-07-01 26 views
5

Intento crear un script de Python que realice consultas en varios sitios. El script funciona bien (uso urllib2) pero solo para un enlace. Para sitios múltiples, hago múltiples solicitudes una tras otra, pero no es muy poderoso.Python: ejecutar varias consultas en paralelo y obtener el primero terminado

¿Cuál es la solución ideal (los hilos, supongo) para ejecutar múltiples consultas en paralelo y detener otras cuando una consulta devuelve una cadena específica, por favor?

me encontré con esta pregunta, pero no he encontrado cómo cambiarlo para detener los hilos restantes ...: Python urllib2.urlopen() is slow, need a better way to read several urls

gracias de antemano!

(lo siento si he cometido errores en Inglés, Francés estoy ^^)

Respuesta

0

lo general, esto se realiza con el patrón siguiente (lo siento, mis conocimientos de Python no son tan buenos).

Tiene una clase llamada Runner. Esta clase tiene un método de larga ejecución, que obtiene la información que necesita. Además, tiene un método de cancelación, que interrumpe el método de larga ejecución de alguna manera (puede hacer que el objeto de solicitud de url sea un campo de miembro de clase, por lo que la clase de cancelación llama al equivalente de request.terminate()).

El método de ejecución prolongada necesita aceptar una función de devolución de llamada, que para señalar cuando haya terminado.

Luego, antes de comenzar sus muchos hilos, crea instancias de todos estos objetos de esa clase y los mantiene en una lista. En el mismo ciclo, puede iniciar estos métodos de larga ejecución, pasando un método de devolución de llamada de su programa principal.

Y, en el método de devolución de llamada, simplemente vaya a través de la lista de todas las clases enhebradas y llame a su método de cancelación.

Por favor, editar mi respuesta con cualquier aplicación específica de Python :)

0

Puede ejecutar sus consultas con la biblioteca multiprocessing, sondeo de los resultados, y el cierre se consulta ya no necesita. Documentation para el módulo incluye información sobre la clase Process que tiene un método terminate(). Si desea limitar el número de solicitudes enviadas, consulte las opciones para agrupar.

2

Puede usar Twisted para tratar múltiples solicitudes al mismo tiempo. Internamente usará epoll (o iocp o kqueue dependiendo de la plataforma) para recibir notificaciones de disponibilidad de tcp de manera eficiente, lo cual es más económico que usar subprocesos. Una vez que una solicitud coincida, usted cancel las demás.

Here is the Twisted http agent tutorial.

Cuestiones relacionadas