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

При разработке приложения Django, развернутого на Apache mod_wsgi, я нашел, что в случае многопоточности (Python распараллеливает; mod_wsgi processes=1 threads=8), Python не будет использовать все доступные процессоры. С многопроцессорным подходом (mod_wsgi processes=8 threads=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)?.

6
задан Community 23 May 2017 в 10:29
поделиться

5 ответов

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

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

Обсуждение см. в http://mail.python.org/pipermail/python-3000/2007-May/007414.html.

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

10
ответ дан 8 December 2019 в 12:19
поделиться

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

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

-121--4144531-

@ Michael На самом деле существует одна ситуация, при которой рекомендуется выдать "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " Это необходимо для того, чтобы нулевые переменные вели себя так, как ожидалось.

-121--2892563-
  1. Будет ли python использовать все процессоры в потоковом режиме? Нет.

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

  3. «1 процесс с небольшим количеством потоков является mod_wsgi подходом по умолчанию». Но это не оптимально и даже не желательно. Это просто дефолт. Не вчитывайся в это.

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

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

Итог

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

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

4
ответ дан 8 December 2019 в 12:19
поделиться

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

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

1
ответ дан 8 December 2019 в 12:19
поделиться

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

3
ответ дан 8 December 2019 в 12:19
поделиться

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

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

1
ответ дан 8 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: