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