Ответ 1
Появление нового потока для каждого подключения - это дизайн очень плохой. Что произойдет, если вас поразит множество подключений?
Фактически, использование потоков для ожидания сетевого ввода-вывода не стоит. Ваша программа становится очень сложной, и вы получаете абсолютно без выгоды, поскольку ожидание сети в потоках не заставит вас ждать быстрее. В этом случае вы теряете только потоки.
Следующий текст из документации python:
Есть только два способа иметь программа на одном процессоре делает "больше чем одна вещь одновременно". Многопоточное программирование Простейший и самый популярный способ сделать это, но есть еще одна очень другой метод, который позволяет вам имеют почти все преимущества многопоточность, без используя несколько потоков. Это правда только если ваша программа в значительной степени связан с В/В. Если ваша программа процессор, а затем упреждающий запланированные потоки, вероятно, вам действительно нужно. Сетевые серверы реже обрабатывается процессор.
И если это процессор, связанный с сервером. вы всегда можете оставить другой процесс/поток для обработки части процессора. Продолжение:
Если ваша операционная система поддерживает выберите системный вызов в своей библиотеке ввода-вывода (и почти все делают), то вы можете использовать он жонглирует несколькими сообщениями каналы одновременно; делать другую работу в то время как ваш ввод-вывод выполняется в "задний план." Хотя эта стратегия может показаться странным и сложным, особенно во-первых, это во многих способы легче понять и контролировать чем многопоточное программирование.
Поэтому вместо использования потоков используйте неблокирующий ввод/вывод: собирайте сокеты в списке и используйте цикл событий с select.select знать, какой сокет имеет данные для чтения. Сделайте это в одном потоке.
Вы можете выбрать асинхронную сетевую инфраструктуру python, такую как twisted, чтобы сделать это за вас. Это избавит вас от многих головных болей. Скрученный код был улучшен в течение многих лет, и он охватывает некоторые угловые случаи, на которые вам потребуется время.
EDIT. Любые существующие асинхронные IO-библиотеки (например, Twisted) представляют собой код Python. Вы могли написать это сами, но это уже написано для вас. Я не понимаю, почему вы не будете использовать одну из этих библиотек и вместо этого напишите свой собственный худший код, так как вы новичок. Networing IO трудно понять.