У меня сокет-сервер работает на тредах. Каждый клиент подключается в отдельном потоке и по плану держит соединение, пока не случится глюк - ошибка, разрыв связи. Подключено одновременно сотни клиентов, в перспективе тысячи. Связь с ними не очень активная, 2-4 запроса в минуту
У меня возникли сомнения по поводу уместности Thread для этой задачи. Есть сомнения что все потоки корректно закрываются.
Хочу узнать количество открытых потоков. Как это правильно сделать?
Выводить thread._count() в основном потоке? Правильно ли он считает реальное число потоков, или не учитывает "подвисшие" потоки?
Нет, это не очень хорошо. Вам желательно использовать легкие (green) треды и/или event pool. Иначе, при большом количестве клиентов уткнетесь в ограничения по количеству тредов.
Посмотрите на асинхронные библиотеки типа aiohttp или twisted cyclone.io.
У меня Python 2.7. Так что библиотеки типа Twisted, Gevent.
А aiohttp это же про http, а не tcp, насколько я понимаю.
При работе с сокетами, треды насколько я понимаю не должны затормаживать выполнение кода. Хотя опять же, их количество немалое.
Сначала все же хочется как-то оценить текущее состояние, иначе непонятно что я оптимизирую:
- Узнать есть ли "мертвые" треды,
- Сколько их, сколько ресурсов съедают,
- Возможно стоит сравнить время ответа клиенту в коде, с реальным временем отправки пакета, покопавшись в tcpdump.
Вот twisted как раз про вас и будет! Там не только http, там и сокеты и даже последовательные порты. Ну а гринлеты под 2.7 тоже работают. И это тоже как раз про сокеты.