Un buen enfoque para resolver este problema es primero escribir el código requerido para obtener un resultado, luego incorporar código de subprocesos para paralelizar la aplicación.
En un mundo perfecto, esto simplemente significaría iniciar simultáneamente 100,000 hilos que generan sus resultados en un diccionario o lista para su posterior procesamiento, pero en la práctica está limitado en la cantidad de solicitudes HTTP paralelas que puede emitir de esta manera. Localmente, tiene límites en la cantidad de sockets que puede abrir simultáneamente, cuántos hilos de ejecución le permitirá su intérprete de Python. De forma remota, puede estar limitado en el número de conexiones simultáneas si todas las solicitudes son contra un servidor o varios. Estas limitaciones probablemente requerirán que escriba el script de tal manera que solo sondee una pequeña fracción de las URL en cualquier momento (100, como se menciona en otro póster, es probablemente un tamaño de grupo de subprocesos decente, aunque puede encontrar que puede implementar con éxito muchos más).
Puede seguir este patrón de diseño para resolver el problema anterior:
- Inicie un subproceso que inicie nuevos subprocesos de solicitud hasta que el número de subprocesos actualmente en ejecución (puede rastrearlos a través de threading.active_count () o insertando los objetos del subproceso en una estructura de datos) es> = su número máximo de solicitudes simultáneas (digamos 100) , luego duerme por un corto tiempo de espera. Este hilo debería terminar cuando no haya más URL para procesar. Por lo tanto, el hilo seguirá despertando, lanzando nuevos hilos y durmiendo hasta que haya terminado.
- Haga que los hilos de solicitud almacenen sus resultados en alguna estructura de datos para su posterior recuperación y salida. Si la estructura en la que está almacenando los resultados es a
list
o dict
en CPython, puede agregar o insertar de forma segura elementos únicos de sus hilos sin bloqueos , pero si escribe en un archivo o requiere una interacción de datos entre hilos más compleja , debe usar un bloqueo de exclusión mutua para proteger este estado de la corrupción .
Te sugiero que uses el enhebrado módulo de . Puede usarlo para iniciar y rastrear hilos en ejecución. El soporte de subprocesos de Python es escaso, pero la descripción de su problema sugiere que es completamente suficiente para sus necesidades.
Por último, si desea ver una aplicación directa bonita de una aplicación de red en paralelo escrito en Python, echa un vistazo a ssh.py . Es una pequeña biblioteca que utiliza subprocesos de Python para paralelizar muchas conexiones SSH. El diseño está lo suficientemente cerca de sus requisitos como para que sea un buen recurso.