Con HTTP::Async podrás bajar varios ficheros, pero solo podrás definir un
proxy.
Con
Coro y con
subs::parallel se podría solventar, de forma sencilla, el tema de la simultaneidad, pero requiere más programación el control de los
proxies disponibles.
Quizás con la técnica de los iteradores se podría solventar.
Hay un módulo llamado
Parallel::Iterator que permite crear un iterador, de forma manual o automática, que es capaz de ejecutar varias tareas en paralelo, y recoger el resultado de cada iteración, porque ese es otro problema grave que tenemos aquí: no puedes lanzar la segunda tanda de peticiones hasta que las primeras se han terminado de procesar, para saber cuáles de ellas han fallado a causa de los
proxies. Así que no hay una verdadera simultaneidad.
Curiosamente, en la documentación de Parallel::Iterator se utiliza como ejemplo la bajada simultánea de varios enlaces web.
El código que te he dado, no creo que funcione en ninguna solución paralela, porque usa estructuras (
array) para llevar control de los URL que quedan y del funcionamiento de los
proxy, y esa información no se transmite entre los distintos procesos.
Fíjate que en la propia descripción del problema hay algo que limita su uso paralelo: dices que si al pedir un fichero, no funciona con un determinado
proxy, hay que descartarlo e intentarlo con otro. Si lo hacemos de forma paralela, podría darse el caso de que un
proxy esté bajando más de un fichero a la vez.