LINUX.ORG.RU

[python] select жрет cpu

 


0

1

Пишу иксовое приложение на python-xlib. Использовал тамошнюю функцию, которая блокировалась, если клиенту не поступает событий. Все было отлично, во время ожидания процесс был внизу топа.

В связи с проблемами вызова иксовых функций из другого потока, решил сделать миниатюрную систему сигналов, посредством создания пайпа, в который другие нити пишут, а основной поток читает и вызывает обработчики. Но чтобы всё работало, пришлось использовать селект, который слушает события на соединении с икс-сервером и на пайпе.

После этого стало кушать процессор. В strace вижу блокировку на select, а отъедает процент. По прикидкам, тормознее стало на порядок, так как раньше cputime был вровень с bmpanel, а сейчас в десять раз больше.

Вопросы:

1) Просто select тормозит от рождения?

2) Или его реализация в питоне?

3) Использование poll, epoll может решить проблему? Или они принципиально ничем от селекта не отличаются?

★★★

> 1) Просто select тормозит от рождения?

Нет.

2) Или его реализация в питоне?

Не замечал.

3) Использование poll, epoll может решить проблему? Или они принципиально ничем от селекта не отличаются?

AFAIK, это всё один и тот же ->poll в драйвере.

Скорее всего, ты что-то не так делаешь. Скажем, поставил слишком маленький тайм-аут.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Скажем, поставил слишком маленький тайм-аут.

Без таймаута. Ждет в селекте до талого.

Тогда буду профайлить.

baverman ★★★
() автор топика
Ответ на: комментарий от tailgunner

Нашел виновника. Помимо селекта, в совершенно левом модуле стал использовать threading.Event.wait, сделанный просто читерски — таймаут выжидается достаточно активно.

Спасибо, что уверил в непричастности select.

baverman ★★★
() автор топика

> решил сделать миниатюрную систему сигналов, посредством создания пайпа, в который другие нити пишут, а основной поток читает и вызывает обработчики.

Зачем такое городить? Чем стандартный класс Queue не устроил?

ntp
()
Ответ на: комментарий от ntp

Чем стандартный класс Queue не устроил?

Ожидание событий от иксов — блокирующая операция. Как из очереди элементы выгребать в *момент* их поступления?

baverman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.