2010-05-13 22 views
10

Estaba buscando escribir un pequeño rastreador web en python. Estaba comenzando a investigar cómo escribirlo como un script multiproceso, un grupo de descarga de subprocesos y un resultado de procesamiento de agrupación. Debido a la GIL, ¿en realidad haría una descarga simultánea? ¿Cómo afecta el GIL a un rastreador web? ¿Cada hilo seleccionará algunos datos del zócalo, luego pasará al siguiente, dejará que recoja algunos datos del zócalo, etc.?¿Un rastreador multiproceso en Python realmente acelera las cosas?

Básicamente lo que estoy pidiendo está haciendo un rastreador multi-roscado en Python realmente me va a comprar mucho el rendimiento vs solo subproceso?

gracias!

Respuesta

1

Cuando se trata de rastrear, es mejor utilizar algo basado en eventos como Twisted que utiliza operaciones de socket asíncronas sin bloqueo para recuperar y devolver datos tal como vienen, en lugar de bloquearlos en cada uno.

Las operaciones de red asíncrona pueden ser sencillas y generalmente tienen un solo subproceso. La E/S de red casi siempre tiene una latencia más alta que la de la CPU porque realmente no tiene idea de cuánto tardará una página en regresar, y aquí es donde brilla la asincronía porque una operación asíncrona es mucho más ligera que una secuencia.

Editar: Aquí está una simple example de cómo utilizar getPage de trenzado para crear un simple rastreador web.

+0

No utilice Twisted. Usa gevent Utiliza asincronización debajo de las cubiertas, pero le permite codificar de forma directa y con varios subprocesos. –

8

El intérprete de Python no ocupa el GIL al realizar operaciones de red. Si está trabajando en una red (como un rastreador), puede ignorar los efectos del GIL.

Por otro lado, es posible que desee medir el rendimiento si crea una gran cantidad de hilos que realizan el procesamiento (después de la descarga). Limitar la cantidad de hilos allí reducirá los efectos del GIL en su rendimiento.

6

vistazo a cómo scrapy obras. Puede ayudarte mucho. No usa hilos, pero puede hacer múltiples descargas "simultáneas", todas en el mismo hilo.

Si se piensa en ello, sólo tiene una sola tarjeta de red, por lo que el procesamiento en paralelo no puede realmente ayudar por definición.

Lo que hace scrapy es simplemente no espere alrededor para la respuesta de una solicitud antes de enviar otra. Todo en un solo hilo.

1

Otra consideración: si usted está raspando un solo sitio web y el servidor pone límites a la frecuencia de las solicitudes de su puede enviar desde su dirección IP, la adición de varios subprocesos puede hacer ninguna diferencia.

0

Sí, el raspado de subprocesos múltiples aumenta la velocidad del proceso significativamente. Este no es un caso donde GIL es un problema. Está perdiendo una gran cantidad de CPU inactiva y ancho de banda no utilizado a la espera de que finalice una solicitud. Si la página web que está raspando está en su red local (un raro caso de raspado), entonces la diferencia entre el multihilo y el raspado de hilos individuales puede ser menor.

Puede probar el punto de referencia usted mismo jugando con uno a "n" hilos. Escribí un rastreador multiproceso simple en Discovering Web Resources y escribí un artículo relacionado en Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Website. Puede seleccionar cuántos hilos usar cambiando la variable de clase NWORKERS en FocusedWebCrawler.

Cuestiones relacionadas