Tu registro rota proxies. Tu petición sigue usando el viejo.
Sigue el punto final seleccionado hasta la llamada HTTP de envío real, en lugar de suponer que imprimir un valor nuevo cambia la configuración de la petición.
El selector imprime el proxy A y luego el proxy B. El registro de peticiones sigue mostrando el proxy A. No hace falta un servicio de red para explicar esa contradicción: puede que quien llama haya descartado el valor de retorno del selector.
Sigue el valor hasta la llamada que envía la petición:
endpoint = choose_proxy()
routes = {'http': endpoint, 'https': endpoint}
response = session.get(target_url, proxies=routes, timeout=15)
Este fragmento presupone una sesión de Requests existente y una URL de proxy validada. Para peticiones públicas permitidas a través de intermediarios públicos, la lista de proxies gratuitos ofrece URL candidatas que pasan por el mismo camino de selección y envío. La palabra clave admitida es proxies. Un auxiliar que imprime un mapeo, o que devuelve uno que nadie asigna, no puede sustituir el mapeo que se facilita aquí.
Mantén la ruta seleccionada local a la operación. En código concurrente, un campo compartido current_proxy puede cambiar entre el registro y el envío. Entonces la selección de otro trabajador puede aparecer junto al resultado equivocado.
Usa un identificador de intento para conectar la selección, la configuración de envío y el resultado. Registra un identificador seguro del punto final en lugar de la URL completa cuando contenga credenciales.
Si esos valores coinciden pero la IP pública observada no cambia, has llegado a otra pregunta: si los puntos finales seleccionados ofrecen salidas distintas o si una pasarela rotatoria retiene una conexión. Primero determina si la aplicación envió la ruta que dice haber seleccionado. De lo contrario, las suposiciones del proveedor pueden ocultar una simple variable obsoleta durante horas.