Как я могу регулировать потоки Python? - PullRequest
6 голосов
/ 03 марта 2012

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

Это специально для web2py, но общее решение подойдет.

Ответы [ 2 ]

4 голосов
/ 03 марта 2012

Я только недавно закончил с этим вопросом, вы не сможете изменить приоритет потока, но есть способы обойти это.

Чтобы дать вам некоторое представление о проблеме, всвязанные с CPU потоки реализации cPython могут вызывать голодание других потоков из-за того, как освобождается и получается глобальная блокировка интерпретатора или GIL.Как ни странно, эта проблема усугубляется в многоядерной среде. Дэвид Бизли , который вы можете найти по адресу http://www.dabeaz.com/python/GIL.pdf., провел по-настоящему подробный анализ и презентацию по этой проблеме.Они длинные, но довольно захватывающие.

Короткая версия состоит в том, что связанный с процессором поток освобождает и повторно запрашивает GIL, прежде чем другие потоки могут быть разбужены, чтобы захватить его.В результате поток, связанный с процессором, удерживает GIL более 90% времени.

Есть несколько шаблонов, которые можно использовать для решения этой проблемы.Например, вы можете запускать задачи, связанные с процессором, в совершенно другом процессе.Это позволит планировщику операционной системы намного лучше управлять совместным использованием ресурсов и позволит вашим потокам web2py продолжать работу, поскольку операционные системы фактически предоставляют преференциальный режим для потоков, связанных с вводом-выводом.Для таких случаев предусмотрена библиотека многопроцессорная .Для его работы потребуется еще немного кода, но это должно помочь.

1 голос
/ 03 марта 2012

Какую версию Python вы используете?В 3.2, GIL был изменен на выход после фиксированных временных интервалов, а не после определенного количества высокоуровневых кодов операций .

Даже с этим изменением выполнение кода с интенсивным использованием ЦП может повлиять на задержкувашего веб-приложения (и наоборот, чувствительная к вводу-выводу часть будет препятствовать тому, чтобы интенсивная загрузка ЦП занимала все ядро).Вы должны просто выделить задачи для рабочих процессов, используя очередь, подобную beanstalkd, и позволить планировщику ОС делать свое дело.

...