Базовая схема будет включать в себя поток, отвечающий за обработку входящих запросов (с заданным вами пределом), а затем передачу их потокам обработчика / запроса. Когда каждый из этих рабочих потоков завершится, вы захотите обновить общий / глобальный счетчик, чтобы основной поток знал, что он может установить новое соединение. Это потребует определенной степени синхронизации, но может быть довольно забавным.
Вот идея:
serverThread:
while true:
serverLock.acquire()
if numberOfRequests < MAX_REQUESTS:
packet = socket.receive()
numberOfRequests++
requestThread(packet).run()
else
serverMonitor.wait(serverLock);
serverLock.release()
requestThread:
//handle packet
serverLock.acquire()
if numberOfRequests == MAX_REQUESTS:
numberOfRequests--
serverMonitor.pulse();
serverLock.release()
Вы хотите убедиться, что синхронизация выполнена правильно, это просто для того, чтобы дать вам представление о том, с чего можно начать. Но когда вы освоитесь, вы сможете оптимизировать и улучшить. Одним конкретным улучшением, которое также поддается ограниченному количеству запросов, является то, что называется ThreadPool .
Несмотря на это, базовая структура практически одинакова для большинства серверов: главный поток отвечает за передачу запросов рабочим потокам. Это аккуратная и простая абстракция.