Sad to say, you really have to use POE currently.. Specifically you need to use POE::Component::Client::HTTP (for (Keep Alive)[http://search.cpan.org/~gwyn/POE-Component-Server-HTTP-KeepAlive-0.0302/lib/POE/Component/Server/HTTP/KeepAlive.pm] pooling), and probably a few more components. I just did this task I had to download 150k photos daily (in SQL) store by the sha1 of their url, resize them, hash them to their SHA1 of the image and hard link this to the sha1 of the url, and update a database to show the sha1 of the image and date downloaded. I did all of this with POE. And, other than a few hard to debug quirks that I'll probably never fix, and random POE core dumps, it works rather well.
We provide our third party affiliates with a much simpler image downloader that takes an image identified in a CSV through the VIN's row, downloads the image, and renames it to vin hyphen [1..n]. You can find it on github. It uses Paraell::ForkMangaer which is another solution but the nature of using it eliminates KA, and pooling that you can get rather easily with POE.
I'd highly suggest not rolling your own threaded solution, history tells us those are typically the worst.