Будет ли Python использовать все процессоры в режиме потока? - PullRequest
6 голосов
/ 10 февраля 2010

При разработке приложения Django, развернутого на Apache mod_wsgi, я обнаружил, что в случае многопоточности (потоки Python; процессы mod_wsgi = 1 поток = 8) Python не будет использовать все доступные процессоры. С многопроцессорным подходом (mod_wsgi Процессы = 8 потоков = 1) все в порядке, и я могу загрузить свою машину на полную.

Итак, вопрос: нормально ли это поведение Python? Я сомневаюсь в этом, потому что использование 1 процесса с несколькими потоками является подходом по умолчанию mod_wsgi.

Система:

2xIntel Xeon серии 5XXX (8 ядер (16 с гиперпоточностью)) на FreeBSD 7.2 AMD64 и Python 2.6.4


Спасибо всем за ответы. Мы все обнаружили, что это поведение нормально из-за GIL. Вот хорошее объяснение: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ или stackoverflow GIL обсуждение: Что такое глобальная блокировка интерпретатора (GIL)? .

Ответы [ 5 ]

10 голосов
/ 10 февраля 2010

Будет ли Python использовать все процессоры в режиме потока? Нет.

Python не будет использовать все доступные процессоры; это поведение Python нормально? Да, это нормально из-за GIL.

Для обсуждения см. http://mail.python.org/pipermail/python-3000/2007-May/007414.html.

Вы можете обнаружить, что наличие пары (или 4) потоков на ядро ​​/ процесс может все еще улучшить производительность, если есть некоторая блокировка, например, ожидание ответа от базы данных может привести к тому, что этот процесс заблокирует другие соединения. 1008 *

4 голосов
/ 10 февраля 2010
  1. Будет ли python использовать все процессоры в режиме потока? Нет.

  2. Это нормально? Да, это нормально. Python не делает никаких усилий, чтобы найти все ваши ядра.

  3. "1 процесс с несколькими потоками - это подход по умолчанию mod_wsgi". Но это не оптимально и даже не желательно. Это просто по умолчанию. Не читайте ничего в это.

Если вы хотите использовать все ресурсы вашего компьютера, заставьте ОС справиться с этим. Используйте процессы.

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

Итог

Использование нескольких процессов, что позволяет ОС (и Apache) максимально использовать систему.

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

3 голосов
/ 10 февраля 2010

Есть еще надежда. GIL является только артефактом реализации C Python, который вы загружаете с python.org. Jython и IronPython являются двумя другими реализациями Python, и у них нет GIL, так что вы можете получить лучшие результаты с одним из них.

1 голос
/ 10 февраля 2010

Да. Python на самом деле не многопоточный. Вместо этого существует глобальная блокировка, и каждый поток выполняет несколько операций по очереди. Это значительно упрощает написание MT-приложений на Python, поскольку не может быть проблем с устаревшими кешами и т. Д.

Таким образом, один процесс Python может занимать только один процессор. Чтобы полностью использовать многоядерную систему, вы должны запустить несколько процессов Python.

1 голос
/ 10 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...