В случае, если вы хотите запускать множество из них параллельно, было бы гораздо более масштабируемым использовать асинхронную сетевую среду, такую как Twisted , где «спящий» не означает блокирование ценной и дорогой ОС потока от какой-то другой полезной работы. Вот примерный набросок того, как вы можете выполнить столько запросов параллельно, сколько пожелаете (установите на 100), с тайм-аутом (5 секунд), задержкой (2 секунды) и настраиваемым числом повторных попыток (здесь 10).
from twisted.internet import defer, reactor
from twisted.web import client
# A semaphore lets you run up to `token` deferred operations in parallel
semaphore = defer.DeferredSemaphore(tokens=100)
def job(url, tries=1, d=None):
if not d:
d = defer.succeed(None)
d.addCallback(lambda ignored: client.getPage(url, timeout=5))
d.addCallback(doSomethingWithData)
def retry(failure):
if tries > 10:
return failure # give up
else:
# try again in 2 seconds
d = defer.succeed(None)
reactor.callLater(2, job, url, tries=tries+1, d=d)
return d
d.addErrback(retry)
return d
for url in manyURLs:
semaphore.run(job, url)