Python - ожидание ввода от множества сокетов - PullRequest
3 голосов
/ 22 ноября 2011

Я работаю над простым экспериментом на Python. У меня есть «главный» процесс, отвечающий за все остальные, и каждый отдельный процесс имеет соединение через сокет unix с главным процессом. Я хотел бы, чтобы главный процесс мог отслеживать все сокеты на предмет ответа, но теоретически их может быть почти сотня. Как потоки повлияют на память и производительность приложения? Какое будет лучшее решение? Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Сто одновременных потоков может раздвинуть разумные пределы потоков.Если вы обнаружите, что это самый чистый способ организации вашего кода, я бы сказал, попробуйте, но многопоточность на самом деле не очень хорошо масштабируется.

Что лучше работает, так это использовать метод, подобный select для ожидания чтения / записи / для одного из сокетов или сообщения об ошибке.Этот механизм позволяет вам засыпать до тех пор, пока не произойдет что-то интересное, обработать столько сокетов, которые нужно обработать, а затем снова вернуться в спящий режим - все в одном потоке выполнения.Удаление многопоточности часто может снизить вероятность ошибок, и этот стиль программирования не должен создавать проблем при сотнях соединений.(Если вы хотите выйти за пределы примерно 100, я бы использовал функциональность poll вместо select - для постоянной перестройки списка интересных файловых дескрипторов требуется время, которое poll не требуется.)

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

1 голос
/ 22 ноября 2011

Самый простой способ проведения сравнительного тестирования потоков и процессов обработки сокетов - это использовать SocketServer в стандартной библиотеке Python.Вы можете легко переключать подходы (оставляя все остальное без изменений), наследуя либо ThreadingMixIn , либо ForkingMixIn .Вот простой пример , с которого можно начать.

Другой альтернативой является подход выбора / опроса с использованием неблокирующих сокетов в одном процессе и в одном потоке.

Если вас интересует программное обеспечение, которое уже полностью разработано и развито, рассмотрите следующие высокопроизводительные серверные пакеты на основе Python:

  • Платформа Twisted использует асинхронный однопроцессный процесс.
  • Фреймворк Tornado аналогичен (менее развит, менее полнофункциональн, но проще для понимания)
  • И Gunicorn , который является высокопроизводительным разветвленным сервером.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...