C'est parce que vous n'utilisez pas correctement PyMongo. Vous créez un nouveau MongoClient pour chaque requête, ce qui vous oblige à ouvrir un nouveau socket pour chaque nouvelle requête. Cela va à l'encontre de la mise en pool des connexions de PyMongo, et en plus d'être extrêmement lent, cela signifie également que vous ouvrez et fermez les sockets plus rapidement que votre pile TCP ne peut le faire :vous laissez trop de sockets dans l'état TIME_WAIT et vous finissez par manquer de ports.
Heureusement, la solution est simple. Créez un MongoClient et utilisez-le partout :
conn = pymongo.MongoClient('mongodb://localhost:27017')
coll = conn.databases['race_results']
def _perform_queries(query):
return coll.find(query).sort("date", -1)