Задать вопрос

Как работать с многоядерными процессорами в Python?

Собственно правильно ли я понимаю, что это вообще невозможно, так как из-за GIL в Python все потоки все равно будут делаться последовательно одним процессором? Актуально ли это для Python 3.4? Как обойти (писать код на C)?
  • Вопрос задан
  • 14152 просмотра
Подписаться 12 Оценить Комментировать
Решения вопроса 1
@kazmiruk
https://docs.python.org/2/library/multiprocessing.html - единственный известный мне способ утилизровать несколько ядер на питоне. GIL есть в обоих ветках питона, обойти никак (вроде, если я не ошибаюсь, написав экстеншн на С, Вы все равно будете вынуждены запускать его в тех же условиях).
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Sly_tom_cat
@Sly_tom_cat
.
from time import time
from threading import Thread
from multiprocessing import Process

def count(n):
while n > 0:
n -= 1

startTime = time()
count(100000000)
count(100000000)
print('\nSequential execution time : %3.2f s.'%(time() - startTime))

startTime = time()
t1 = Thread(target=count, args=(100000000,))
t2 = Thread(target=count, args=(100000000,))
t1.start(); t2.start()
t1.join(); t2.join()
print('\nThreaded execution time : %3.2f s.'%(time() - startTime))

startTime = time()
p1 = Process(target=count, args=(100000000,))
p2 = Process(target=count, args=(100000000,))
p1.start(); p2.start()
p1.join(); p2.join()
print('\nMultiprocessed execution time : %3.2f s.'%(time() - startTime))

Дает на 4-х ядерном проце:

Sequential execution time : 6.83 s.

Threaded execution time : 11.37 s.

Multiprocessed execution time : 6.30 s.

Но допустим распараллеливание запросов к http серверу и в thread варианте даст огромный выигрыш.
Т.е. без учета специфики задачи - в многопоточность/многопроцессорность - лучше просто не соваться.
Ответ написан
kir64
@kir64
python developer
kazmiruk абсолютно прав. Пишем проект на python2, используем multiprocessing (не threading!) и все прекрасно работает.
Ответ написан
Комментировать
@iegor Автор вопроса
Смотрел видео с конференции по Python. В общем: GIL действует только на питоновский код, т.е. если Python выступает лишь оберткой, а ресурсоемкие операции делаются C, то сишный код будет распределен операционной системой на разные процессоры и в итоге получается прирост производительности.
Ответ написан
Комментировать
MadRiw
@MadRiw
GIL нет в Jython и IronPython, можете копнуть в их сторону.
Ответ написан
Комментировать
nikolay_karelin
@nikolay_karelin
Ведущий разработчик, пишу на Python, Tcl, Matlab
В целом, присоединяюсь к предыдущим ответам - из-за GIL на чистом питоне только несколько процессов. Если же будете либо писать расширения, либо использовать готовые билиотеки (например NumPy), то GIL внутри кода расширения можно отпустить.

Кстати, как правило NumPy скомпилированный с MKL загрузит на своих задачах все ядра процессора ;)

Если нужны еще советы, лучше кратко описать в чем состоит задача.
Ответ написан
Комментировать
@ZoomLS
Есть форк Python с поддержкой многоядерной архитектуры. Вроде даже возможно слияние с одной из будущих версий Python. Вот только название сходу вспомнить не могу. Гуглится совсем не то.

Есть ещё PyPy-STM, интерпретатора Python с поддержкой многоядерных систем:
PyPy-STM (PyPy Software Transactional Memory), в рамках которого развивается реализация языка Python, способная распараллеливать выполнение разных потоков одного многопоточного приложения на нескольких ядрах CPU. Разработка PyPy-STM направлена на устранение одной из основных проблем СPython - наличие глобальной блокировки интерпретатора (GIL, global interpreter lock), не позволяющей обеспечить параллельное выполнение нескольких нитей кода на языке Python.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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