2016-02-11 3 views
1

Я запускаю программу python на сервере с python2.7.6. Я использовал threading модуль python для создания нескольких потоков. Я создал 23 потока, поэтому я смущен, действительно ли используются все мои ядра процессора или нет. Есть ли способ проверить это на моем сервере. Любое предложение как идеальное количество потоков, которое должно быть создано в соответствии с количеством процессоров, которые у нас есть, чтобы повысить эффективность моей программы.Как следует создавать потоки в python

ответ

1

David Beazly имеет a great talk on threading в Python. У него также отличная презентация по теме here.

К сожалению, у Python есть что-то, называемое GIL, которое ограничивает выполнение Python одним потоком за раз. Чтобы использовать все ваши ядра, вам придется использовать несколько процессов: See Multiprocessing.

Некоторые из сообществ Python не обязательно смотрят на GIL как неудачу, вы можете использовать несколько ядер с помощью других средств, кроме потоков с разделяемой памятью.

Посмотрите здесь для great blog post on utilizing multiple cores in Python.

Edit: Вышесказанное справедливо для CPython (наиболее распространенный, а также ссылки реализация Python). Там в несколько "yes but" ответы там (в основном ссылаясь на многопоточность на другую реализацию Python), но я обычно указывают людей на answers like this one, которые описывают GIL в CPython и альтернативы для использования нескольких ядер 6

+0

Спасибо, что ответили, но моя программа изначально использовалась для завершения около 14 минут. Однако после подачи резьбы он уменьшился до 3 минут. Поэтому определенно я думаю, что несколько ядер используются, поскольку время резко сократилось. – kkk

+0

@kkk - если вы просмотрите ссылки, которые я разместил, вы должны хорошо разбираться в многопоточности в Python. Многопоточность может повысить производительность, когда ваш процесс интенсивнее, поскольку поток освободит его блокировку на GIL, пока он занят, ожидая ресурсов ввода-вывода. Если ваше приложение имеет интенсивность процессора; вы увидите мало или вообще не улучшите производительность при использовании нескольких потоков. Вы даже можете увидеть серьезное нарушение производительности! – nlloyd

0

Там нет реального ответа на этот вопрос, и у всех может быть другое мнение. Определение количества потоков для вашего приложения для повышения производительности должно быть определено после тестирования для x сценариев с y потоков. Производительность зависит от того, как планировщик ОС планирует ваши потоки в доступных ядрах ЦП в зависимости от загрузки процессора или количества запущенных процессов. Если у вас 4 ядра, это не значит, что полезно выполнять только 4 потока. На самом деле вы также можете запустить 23 потока. Это то, что мы называем иллюзией параллелизма, предоставляемой нам планировщиком, путем планирования процессов после процессов, заставляя нас думать, что все работает одновременно.

Вот вещь

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

+0

Да, верно, что полный процесс занимает сравнительно меньшее время, но можете ли вы рассказать мне, как потоки распределяются между разными процессорами при использовании модуля потоковой передачи? – kkk

+0

Мы не можем. Ядро выделяет его на основе разных алгоритмов.Однако, как только поток получает процессор, ОС пытается выделить поток для этого ЦП, всегда называемого как локальность ссылки –

+0

okk получил это, но потоки выделяются для разных процессоров при использовании модуля потоков python. – kkk

Смежные вопросы