2012-05-11 23 views
7

Duplicar posible:
Multiple (asynchronous) connections with urllib2 or other http library?¿Método ideal para enviar múltiples solicitudes HTTP sobre Python?

estoy trabajando en un servidor web Linux que se ejecuta el código Python para tomar datos en tiempo real a través de HTTP de una API de tercera parte. Los datos se ponen en una base de datos MySQL. Necesito hacer muchas consultas a muchas URL, y necesito hacerlo rápido (más rápido = mejor). Actualmente estoy usando urllib3 como mi biblioteca HTTP. ¿Cuál es la mejor manera de hacerlo? ¿Debo generar múltiples hilos (si es así, cuántos?) Y cada consulta para una URL diferente? Me encantaría escuchar sus pensamientos sobre esto, ¡gracias!

Respuesta

23

Si mucho es realmente una gran cantidad que es probable que desee utilizar no io asíncrono hilos.

requests + = geventgrequests

GRequests le permite utilizar solicitudes con GEvent para realizar peticiones HTTP asíncronas fácilmente.

import grequests 

urls = [ 
    'http://www.heroku.com', 
    'http://tablib.org', 
    'http://httpbin.org', 
    'http://python-requests.org', 
    'http://kennethreitz.com' 
] 

rs = (grequests.get(u) for u in urls) 
grequests.map(rs) 
+1

Quiero utilizar este método para enviar solicitudes a aproximadamente 50,000 urls. ¿Es una buena estrategia? Además, ¿qué pasa con las excepciones como el tiempo de espera, etc.? – John

+0

@John Sí, lo es. En cuanto a las excepciones, consulte el parámetro ['safe_mode'] (http://requests.readthedocs.org/en/latest/api/) y emita [953] (https://github.com/kennethreitz/requests/pull/953) –

+5

No puedo enviar más de 30 solicitudes usando grequest. Cuando lo hago, obtengo "Reintentos máximos excedidos con url: ..., Demasiados archivos abiertos". ¿Hay alguna manera de arreglar este problema? – AliBZ

1

Debe usar solicitudes de subprocesamiento múltiple y de canalización. Por ejemplo búsqueda-> detalles-> guardar

El número de hilos que puede utilizar no depende únicamente de su equipo. ¿Cuántas solicitudes puede atender el servicio? ¿Cuántas solicitudes simultáneas permite ejecutar? Incluso su ancho de banda puede ser un cuello de botella.

Si habla de un tipo de raspado, el servicio podría bloquearlo después de cierto límite de solicitudes, por lo que debe usar proxies o múltiples enlaces IP.

En mi caso, en la mayoría de los casos, puedo ejecutar entre 50 y 300 solicitudes concurrentes en mi computadora portátil desde scripts de Python.

+0

De acuerdo con Polscha, aquí. La mayoría de las veces, cuando realiza solicitudes HTTP a un servicio arbitrario, la mayor parte del tiempo (reloj) gastado está a la espera de que la red y el servicio remoto respondan. Entonces, dentro de lo razonable, cuantos más hilos, mejor en un momento dado, la mayoría de esos hilos estarán en espera. Definitivamente, preste atención a las notas de Polscha sobre el estrangulamiento del servicio. – parselmouth

+0

gracias chicos - el servicio es comercial y estamos pagando por ello. es muy rápido y no será el cuello de botella. en este caso, ¿cuál sería la mejor opción? – user1094786

+0

@ user1094786 En este caso, intente crear una cartera de solicitudes y experimente con varios hilos en cada etapa. Solo inténtalo, tarde o temprano encontrarás el límite superior :-) –

0

Suena como una excelente aplicación para Twisted. Aquí hay algunos web-related examples, que incluyen cómo download a web page. Aquí hay una pregunta relacionada en database connections with Twisted.

Tenga en cuenta que Twisted hace no dependa de subprocesos para hacer varias cosas a la vez. Más bien, toma un enfoque cooperative multitasking --- su secuencia de comandos principal inicia el reactor y el reactor llama a las funciones que configura. Sus funciones deben devolver el control al reactor antes de que el reactor pueda seguir funcionando.

Cuestiones relacionadas