Dzieje się tak, ponieważ niepoprawnie używasz PyMongo. Tworzysz nowego MongoClient dla każdego zapytania, co wymaga otwarcia nowego gniazda dla każdego nowego zapytania. Pokonuje to buforowanie połączeń PyMongo, a oprócz tego, że jest bardzo powolne, oznacza to również, że otwierasz i zamykasz gniazda szybciej niż twój stos TCP może nadążyć:pozostawiasz zbyt wiele gniazd w stanie TIME_WAIT, więc w końcu zabraknie Ci portów.
Na szczęście poprawka jest prosta. Utwórz jednego MongoClient i używaj go przez cały czas:
conn = pymongo.MongoClient('mongodb://localhost:27017')
coll = conn.databases['race_results']
def _perform_queries(query):
return coll.find(query).sort("date", -1)