El multithreading es de gran importancia a la hora de construir un scraper o cualquier otro proceso que requiera este tipo de programación.
El principal motivo es que mientras hacemos una petición web nuestro equipo estará ocioso durante unos segundos esperando respuesta y será posteriormente una vez reciba los datos cuando realizará la extracción y accederá a siguiente petición.
Si perdemos por ejemplo el 80% del tiempo en modo de espera, nuestro robot estará procesando tareas solo durante una breve parte del tiempo, aprovechando ese 20% restante.
WinAutomation no permite hasta el momento procesos en paralelo o threads, pero si permite abrir múltiples instancias de un mismo bot; con esto conseguiremos una ejecución en paralelo.
Cada instancia tendrá una ejecución secuencial, es decir, emplearemos un solo hilo de ejecución por cada ejecutable. Esta concurrencia no significa que se realicen las tareas al mismo tiempo, sino que cada proceso solicitará su turno y mediante bloqueos respetarán el orden en las tareas: almacenado de resultados, asignación de direcciones, trazado de errores, etc.
Cada proceso irá alternando estos tiempos dejando huecos al resto cuando sus instrucciones no requieran de un bloqueo.
Este es un esquema simple del código:
Voy a comentar lo más destacado del algoritmo:
Disponemos de un fichero de rutas en el que guardamos una dirección por línea, este fichero de direcciones lo copiamos a la variable lista %feeds%.
También inicializamos el fichero linea.txt con el valor 0. Este archivo lo utilizaremos como índice o marcador de lectura entre procesos.
El siguiente paso es abrir una instancia del navegador que perdurará hasta el final del proceso.
Bloqueamos el Handle A para leer el valor almacenado en linea.txt.
Mientras queden direcciones por visitar, actualizaremos este índice, desbloqueamos el Handle A y visitamos la URL para hacer la extracción de datos.
Una vez tenemos el resultado bloqueamos el Handle B para escribir en el fichero de resultados y volvemos a empezar la siguiente iteración.
Cuando no queden direcciones que recorrer cerramos la instancia del navegador y detenemos el proceso.
Para ejecutar varias instancias abriremos el mismo ejecutable tantas veces como sea necesario.
Es sencillo crear un fichero .bat para que sea mas cómodo.
start scraper.exe start scraper.exe start scraper.exe
En el siguiente vídeo tienes un ejemplo del bot con 6 instancias simultáneas:
Recuerda inicializar los ficheros antes de empezar, de forma manual o con un pequeño script:
Para saber si hay un proceso concreto en ejecución, ejecuta una acción Run Powershell Script con:
@(get-process -ea silentlycontinue '%proceso%').count
Sustituyendo la variable %proceso% por el nombre de tu ejecutable, sin la extensión.
Espero que este artículo sobre multi threading con WinAutomation te sirva de base para programar tu propio bot.
Tienes la posibilidad de añadirle algunas las variaciones para tu caso particular, la mejora en optimización del tiempo es evidente y podrás decidir cuantas instancias necesitas sin tener que modificar el código fuente.