Сто одновременных потоков может раздвинуть разумные пределы потоков.Если вы обнаружите, что это самый чистый способ организации вашего кода, я бы сказал, попробуйте, но многопоточность на самом деле не очень хорошо масштабируется.
Что лучше работает, так это использовать метод, подобный select
для ожидания чтения / записи / для одного из сокетов или сообщения об ошибке.Этот механизм позволяет вам засыпать до тех пор, пока не произойдет что-то интересное, обработать столько сокетов, которые нужно обработать, а затем снова вернуться в спящий режим - все в одном потоке выполнения.Удаление многопоточности часто может снизить вероятность ошибок, и этот стиль программирования не должен создавать проблем при сотнях соединений.(Если вы хотите выйти за пределы примерно 100, я бы использовал функциональность poll
вместо select
- для постоянной перестройки списка интересных файловых дескрипторов требуется время, которое poll
не требуется.)
Стоит рассмотреть Python Twisted Framework .Они достигли некоторой длины, чтобы обеспечить последовательный способ привязки обратных вызовов к событиям для этого точного вида программирования.(Если вы знакомы с node.js
, это немного похоже на это, но на Python.) Я должен признать, что немного отклонился от Twisted - я никогда не заходил слишком далеко в их документации, не будучи совершенно сбит с толку - но aМногие люди сделали это дальше, чем я .Возможно, вы найдете его лучше, чем я.