Управление приоритетом планирования потоков Python?

Я написал сценарий, который использует два пула потоков по десять потоков в каждом для извлечения данных из API. Пул потоков реализует этот код в ActiveState. Каждый пул потоков отслеживает базу данных Redis через PubSub для новых записей. Когда новая запись публикуется, python передает данные функции, которая использует подпроцесс python. POpen для выполнения PHP-оболочки, выполняющей реальную работу по вызову API.

Эта система запуска оболочек PHP необходима для работы с моим веб-приложением PHP, поэтому нельзя избежать запуска оболочек PHP с помощью Python.

Этот скрипт будет работать только на серверах Linux.

Как контролировать приоритетность (приоритет планирования) потоков приложения?

Изменить:

Кажется, что контроль приоритета планирования для отдельных потоков в Python невозможен. Есть ли решение для Python или, по крайней мере, команда UNIX, которую я могу запустить вместе со своим скриптом, чтобы контролировать приоритет?

Редактировать 2:

Ну, я так и не нашел способ python справиться с этим. Я просто запускаю свой скрипт с помощью nice сейчас, например:

nice -n 19 python MyScript.py

person backus    schedule 10.07.2012    source источник


Ответы (5)


Я считаю, что приоритет потоков не контролируется в python из-за того, как они реализованы с использованием глобальной блокировки интерпретатора (GIL). Сказав это, даже если бы вы могли дать одному потоку больше приоритета обработки ЦП, реализация Python, которая передает GIL, не знала бы об этом, поскольку она передавала GIL. Если бы вы могли повысить точность в одном потоке в вашем пуле (скажем, он выполняет более важную работу), вам нужно было бы использовать собственную реализацию блокировок, чтобы чаще предоставлять потоку с более высоким приоритетом доступ к GIL.

Поиск в Google возвращает эту статью, которая, я считаю, похожа на то, что вы спрашиваете.

Объясняет, почему это не работает http://www.velocityreviews.com/forums/t329441-threading-priority.html

Объясняет обходной путь, который я предлагал http://bytes.com/topic/python/answers/645966-setting-thread-priorities

person Paul Seeb    schedule 10.07.2012
comment
Спасибо за ответ! Теперь я перефразировал вопрос, спрашивая, как я могу установить приоритет расписания для приложения в целом, а не для отдельного человека. Это все еще должно удовлетворять мои потребности. Я проголосовал за ваш ответ и выберу вас как лучший ответ, если я не получу других ответов. - person backus; 11.07.2012

Это не работает, но я пробовал:

  1. получение родительского pid и приоритета
  2. запуск потоков с помощью concurrent.futures.ThreadPoolExecutor
  3. использование ctypes для получения идентификатора потока (linux) из потока (работает)
  4. используя tid с os.setpriority(os.PRIO_PROCESS,tid,parent_priority+1)
  5. вызов pool.shutdown() из родителя.

Даже с обильным добавлением os.sched_yield() дочерние потоки на самом деле никогда не проходят дальше setpriority().

Читая справочные страницы, кажется, что потоки не имеют возможности изменять (даже свой) приоритет планирования; вам нужно что-то сделать с «возможностями», чтобы дать потоку возможность «CAP_SYS_NICE». Запуск процесса с правами root также не помог; дочерние потоки по-прежнему не запускаются.

person Andrew Wagner    schedule 22.08.2018

В python threading-docs явно упоминается, что нет поддержки установки приоритетов потоков. :

Дизайн этого модуля в общих чертах основан на модели многопоточности Java. Однако там, где Java делает блокировки и условные переменные базовым поведением каждого объекта, в Python они являются отдельными объектами. Класс Thread в Python поддерживает подмножество поведения класса Thread в Java; в настоящее время нет приоритетов, нет групп потоков, и потоки нельзя уничтожить, остановить, приостановить, возобновить или прервать. Статические методы Java-класса Thread при реализации сопоставляются с функциями уровня модуля.

person Darkonaut    schedule 23.08.2018

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

Взгляните на threading2, который является встраиваемой заменой и расширением для модуль threading по умолчанию, с поддержкой — своего рода — для приоритета и сходства.

person Luca Lenardi    schedule 20.06.2015
comment
Сейчас он не поддерживается, есть ссылка, которая ведет на rfk.id.au /blog/entry/archiving-open-source-projects :( - person Andre Miras; 30.05.2018

Мне было интересно, может ли этот ответ на другой связанный вопрос быть полезным в этом сценарии? (ссылка)

Поскольку вы уже используете Subprocess.POpen для запуска вашего PHP-скрипта, мне кажется, что вы можете использовать «preexec_fn» и либо предопределенную функцию, либо лямбда-функцию (как показано в приведенном выше связанном ответе), чтобы установить хороший уровень каждого запущенного потока PHP?

person Spam Hater    schedule 08.08.2012