Можно использовать workerpool
Вот
ссылка на туториал
В вашем случае код будет примерно таким:
import os
import urllib
import workerpool
urls = ['http://example.com/1','http://example.com/2']
class DownloadJob(workerpool.Job):
def __init__(self, url):
self.url = url # The url we'll need to download when the job runs
def run(self):
save_to = os.path.basename(self.url)
urllib.urlretrieve(self.url, save_to)
pool = workerpool.WorkerPool(size=5)
for url in urls:
job = DownloadJob(url.strip())
pool.put(job)
pool.shutdown()
pool.wait()
Также обратите внимание на
urllib3 (он более корректно и гибко работает с параллельными запросами)