SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Введение в потоки
GIL и новый GIL

Андрей Нехайчик
Wargaming.net
Из чего сделана эта презентация
3 доклада David Beazley:
● Inside the Python GIL, июнь 2009
● Inside the New GIL, январь 2010
● Understanding the Python GIL,
февраль 2010
http://www.dabeaz.com/GIL/

- Специфический внутряк для
разработчиков ядра питона
+ Свежие тесты
Немного о потоках
● для распараллеливания однотипных
задач
● используется pthread

Отличия от процессов
● поток – наименьшая единица обработки
● поток – составной элемент процесса
● потоки работают в едином адресном
пространстве
● потоки “дешевле” и, обычно, ОС проще
ими манипулировать
Как работают потоки в идеале
1 ядро
Как работают потоки в идеале
3 ядра
Пример
def count(n):
while n > 0:
n -= 1
t1 = Thread(target=count, args=(100000000, ))
t2 = Thread(target=count, args=(100000000, ))
t1.start()
t2.start()
t1.join()
t2.join()
Пример
def count(n):
while n > 0:
n -= 1
t1 = Thread(target=count, args=(100000000, ))
t2 = Thread(target=count, args=(100000000, ))
t1.start()
t2.start()
t1.join()
t2.join()

прекратите
тиражировать
бесполезный пример
Пример: поиск простых чисел
def is_odd_prime(num):
for multiplier in range(3, num, 2):
if num % multiplier == 0:
return False
return True
def store_odd_primes(storage, max_number, start_number=3):
for num in range(start_number, max_number + 1, 2):
if is_odd_prime(num):
storage.append(num)
numbers = [2]
store_odd_primes(numbers, 20000)
store_odd_primes(numbers, 40000, start_number=20001)
print len(numbers)
Пример: поиск простых чисел
from threading import Thread
...
numbers = [2]
thread1=Thread(target=store_odd_primes, args=(numbers, 20000, ))
thread1.start()
thread2=Thread(target=store_odd_primes, args=(numbers, 40000, ),
kwargs={'start_number': 20001})
thread2.start()
thread1.join()
thread2.join()
print len(numbers)
Результаты
Поиск простых чисел до 40000
неоптимальным алгоритмом
Окружение

Последовательное
выполнение

2 потока
(1 ядро)

2 потока
(2 ядра)

python 2.7.5
(2GHz, Gentoo)

5.40

5.41

5.92 (+10%)

python 3.2.5

8.80

9.02

12.11 (+40%)

python 3.3.3

8.90

8.90

12.20 (+40%)

python 2.7.3
(1GHz, iOS 7, iPad 3)

23.90

-

25.30 (+5%)

python 2.7.2
(2.5GHz, OS X 10.8)

3.56

-

3.90 (+10%)
Потоки в Python
● Существует GIL и гарантирует
последовательное выполнение байткода
● Каждые 100 тиков: освобождение и захват
GIL
● 1 тик – одна или более инструкций
байткода
● IO освобождает GIL
● Си-модули могут освобождать GIL
● Освобождение и захват GIL –
дополнительные накладные расходы
Потоки в Python
Обработка сигналов
Профилирование однопоточной
программы
python -m cProfile prime_seq.py
ncalls
1
1

tottime
0.001
0.015

9999
1229

0.797
0.001

1

0.000

# 10000

filename:lineno(function)
prime_seq.py:1(<module>)
prime_seq.py:3
(get_prime_list)
prime_seq.py:5(is_prime)
{method 'append' of
'list' objects}
{method 'disable' of
'_lsprof.Profiler' objects}
Профилирование многопоточной
программы
ncalls tottime percall cumtime percall filename:lineno(function)
………
2

0.000

0.000

0.886

0.443 threading.py:909(join)

25

0.886

0.035

0.886

0.035 {method 'acquire' of 'thread.lock'}

97

0.000

0.000

0.000

0.000 {method 'append' of 'list'}

1

0.000

0.000

0.000

0.000 {method 'disable' of

………

'_lsprof.Profiler'}
2

0.000

0.000

0.000

0.000 {method 'extend' of 'list'}

2

0.000

0.000

0.000

0.000 {method 'get' of 'dict'}

1

0.000

0.000

0.000

0.000 {method 'insert' of 'list'}

2

0.000

0.000

0.000

0.000 {method 'items' of 'dict'}

1

0.000

0.000

0.000

0.000 {method 'lower' of 'str'}

12

0.000

0.000

0.000

0.000 {method 'release' of 'thread.lock'}

1

0.000

0.000

0.000

0.000 {method 'rfind' of 'str'}

2

0.000

0.000

0.000

0.000 {method 'setter' of 'property'}

6

0.000

0.000

0.000

0.000 {method 'write' of 'file'}
Вернёмся к начальному примеру
def count(n):
while n > 0:
n -= 1
Последовательное

2 потока
(2 ядра)

Разница

python 2.7.5,
Gentoo, 2Ghz

20.0

27.7

x1.4

python 3.2.5

19.7

34.5

x1.8

David Beazley
OS X, 2GHz

24.6

45.5

x1.8

python 2.7.2
OS X 10.8, 2.5 Ghz i5

15.2

23.7

x1.6
Почему такие большие накладные
расходы (1 ядро)?
Почему такие большие накладные
расходы (2 ядра)?
Визуализация попыток захвата
Промежуточные итоги
● Код параллельно не выполняется
● Но IO (всегда) и CPython расширения
(некоторые) освобождают GIL
● Нет планировщика потоков
● Сигналы обрабатываются в главном
потоке
● Потоки с интенсивным использованием
CPU передерживают GIL
● Провальные попытки захвата GIL
Зачем нужен GIL?
● Защита операций работы с памятью в
ядре
● Упрощение кода
● Скорость выше, если код проще
GIL в python 3.2
● Первое серьёзное изменение со времён
1992 года
● Вместо счётчика тиков - gil_drop_request
● Также добавлен таймаут в 5мс
Как это работает?
Проблемы с таймаутом
Проблемы из-за отсутствия
планировщика
Замедление IO
Какие планы по GIL
Его заменят, если новый подход будет:
● простым
● увеличит скорость для многопоточных
программ
● не изменит скорость для однопоточных
● будет совместим с текущим API ядра
● оставит такое же поведение GC
Как обойти GIL
● Для IO этого делать не надо
● Использовать специализированные
библиотеки:
https://wiki.python.org/moin/ParallelProcessing

(например scipy)
● Использовать другие интерпретаторы
● Использовать multiprocessing
Использовать другие
интерпретаторы
Последовательное

2 потока
(2 ядра)

4 потока
(4 ядра)

jython 2.5.3
(Gentoo, i3 3Ghz)

10.70

8.65 (x1.24)

6.85 (x1.56)

pypy 2.0.2
(Gentoo, i3 3Ghz)

2.75

2.85

2.90
Multiprocessing
from multiprocessing import Process, Pipe
…
def store_odd_primes(pipe_conn, max_number, start_number=3):
storage = []
for num in range(start_number, max_number + 1, 2):
if is_odd_prime(num):
storage.append(num)
pipe_conn.send(storage)
numbers = [2]
parent_conn, child_conn = Pipe()
proc1 = Process(target=store_odd_primes, args=(child_conn, 20000, ))
proc2 = Process(target=store_odd_primes, args=(child_conn, 40000, ),
kwargs={'start_number': 20001})
proc1.start();proc2.start();proc1.join();proc2.join()
numbers += parent_conn.recv()
numbers += parent_conn.recv()
print len(numbers)
Multiprocessing
Последовательное

2 процесса
(2 ядра)

4 потока
(4 ядра)

python 2.6.8
(Gentoo, i3 3Ghz)

3.80

2.80 (x1.35)

2.08 (x1.83)

python 3.2.5
(Gentoo, i3 3Ghz)

5.05

3.68 (x1.37)

3.10 (x1.63)

pypy 2.0.2
(Gentoo, i3 3Ghz)

0.50

0.42 (x1.20)

0.33 (x1.55)
Выводы
● Параллельной многопоточности в Python
по умолчанию нет
● Она частично существует для
специализированных расширений и
операций IO
● GIL почти никогда не мешает
● А когда мешает мы знаем как с этим
бороться
Спасибо.

Contenu connexe

Tendances

«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ontico
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Mikhail Kurnosov
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
Ontico
 

Tendances (20)

Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питона
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 

Similaire à Введение в GIL и новый GIL

ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
it-people
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
it-people
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
sef2009
 

Similaire à Введение в GIL и новый GIL (20)

ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
 
Git for you
Git for youGit for you
Git for you
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocols
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Build your own multistack JS startup
Build your own multistack JS startupBuild your own multistack JS startup
Build your own multistack JS startup
 
Параллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахПараллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартах
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
 
Purely practical data structures
Purely practical data structuresPurely practical data structures
Purely practical data structures
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 

Plus de Python Meetup

S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
Python Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 

Plus de Python Meetup (20)

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Pebble
PebblePebble
Pebble
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 

Dernier

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 

Dernier (9)

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 

Введение в GIL и новый GIL

  • 1. Введение в потоки GIL и новый GIL Андрей Нехайчик Wargaming.net
  • 2. Из чего сделана эта презентация 3 доклада David Beazley: ● Inside the Python GIL, июнь 2009 ● Inside the New GIL, январь 2010 ● Understanding the Python GIL, февраль 2010 http://www.dabeaz.com/GIL/ - Специфический внутряк для разработчиков ядра питона + Свежие тесты
  • 3. Немного о потоках ● для распараллеливания однотипных задач ● используется pthread Отличия от процессов ● поток – наименьшая единица обработки ● поток – составной элемент процесса ● потоки работают в едином адресном пространстве ● потоки “дешевле” и, обычно, ОС проще ими манипулировать
  • 4. Как работают потоки в идеале 1 ядро
  • 5. Как работают потоки в идеале 3 ядра
  • 6. Пример def count(n): while n > 0: n -= 1 t1 = Thread(target=count, args=(100000000, )) t2 = Thread(target=count, args=(100000000, )) t1.start() t2.start() t1.join() t2.join()
  • 7. Пример def count(n): while n > 0: n -= 1 t1 = Thread(target=count, args=(100000000, )) t2 = Thread(target=count, args=(100000000, )) t1.start() t2.start() t1.join() t2.join() прекратите тиражировать бесполезный пример
  • 8. Пример: поиск простых чисел def is_odd_prime(num): for multiplier in range(3, num, 2): if num % multiplier == 0: return False return True def store_odd_primes(storage, max_number, start_number=3): for num in range(start_number, max_number + 1, 2): if is_odd_prime(num): storage.append(num) numbers = [2] store_odd_primes(numbers, 20000) store_odd_primes(numbers, 40000, start_number=20001) print len(numbers)
  • 9. Пример: поиск простых чисел from threading import Thread ... numbers = [2] thread1=Thread(target=store_odd_primes, args=(numbers, 20000, )) thread1.start() thread2=Thread(target=store_odd_primes, args=(numbers, 40000, ), kwargs={'start_number': 20001}) thread2.start() thread1.join() thread2.join() print len(numbers)
  • 10. Результаты Поиск простых чисел до 40000 неоптимальным алгоритмом Окружение Последовательное выполнение 2 потока (1 ядро) 2 потока (2 ядра) python 2.7.5 (2GHz, Gentoo) 5.40 5.41 5.92 (+10%) python 3.2.5 8.80 9.02 12.11 (+40%) python 3.3.3 8.90 8.90 12.20 (+40%) python 2.7.3 (1GHz, iOS 7, iPad 3) 23.90 - 25.30 (+5%) python 2.7.2 (2.5GHz, OS X 10.8) 3.56 - 3.90 (+10%)
  • 11. Потоки в Python ● Существует GIL и гарантирует последовательное выполнение байткода ● Каждые 100 тиков: освобождение и захват GIL ● 1 тик – одна или более инструкций байткода ● IO освобождает GIL ● Си-модули могут освобождать GIL ● Освобождение и захват GIL – дополнительные накладные расходы
  • 14. Профилирование однопоточной программы python -m cProfile prime_seq.py ncalls 1 1 tottime 0.001 0.015 9999 1229 0.797 0.001 1 0.000 # 10000 filename:lineno(function) prime_seq.py:1(<module>) prime_seq.py:3 (get_prime_list) prime_seq.py:5(is_prime) {method 'append' of 'list' objects} {method 'disable' of '_lsprof.Profiler' objects}
  • 15. Профилирование многопоточной программы ncalls tottime percall cumtime percall filename:lineno(function) ……… 2 0.000 0.000 0.886 0.443 threading.py:909(join) 25 0.886 0.035 0.886 0.035 {method 'acquire' of 'thread.lock'} 97 0.000 0.000 0.000 0.000 {method 'append' of 'list'} 1 0.000 0.000 0.000 0.000 {method 'disable' of ……… '_lsprof.Profiler'} 2 0.000 0.000 0.000 0.000 {method 'extend' of 'list'} 2 0.000 0.000 0.000 0.000 {method 'get' of 'dict'} 1 0.000 0.000 0.000 0.000 {method 'insert' of 'list'} 2 0.000 0.000 0.000 0.000 {method 'items' of 'dict'} 1 0.000 0.000 0.000 0.000 {method 'lower' of 'str'} 12 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock'} 1 0.000 0.000 0.000 0.000 {method 'rfind' of 'str'} 2 0.000 0.000 0.000 0.000 {method 'setter' of 'property'} 6 0.000 0.000 0.000 0.000 {method 'write' of 'file'}
  • 16. Вернёмся к начальному примеру def count(n): while n > 0: n -= 1 Последовательное 2 потока (2 ядра) Разница python 2.7.5, Gentoo, 2Ghz 20.0 27.7 x1.4 python 3.2.5 19.7 34.5 x1.8 David Beazley OS X, 2GHz 24.6 45.5 x1.8 python 2.7.2 OS X 10.8, 2.5 Ghz i5 15.2 23.7 x1.6
  • 17. Почему такие большие накладные расходы (1 ядро)?
  • 18. Почему такие большие накладные расходы (2 ядра)?
  • 20. Промежуточные итоги ● Код параллельно не выполняется ● Но IO (всегда) и CPython расширения (некоторые) освобождают GIL ● Нет планировщика потоков ● Сигналы обрабатываются в главном потоке ● Потоки с интенсивным использованием CPU передерживают GIL ● Провальные попытки захвата GIL
  • 21. Зачем нужен GIL? ● Защита операций работы с памятью в ядре ● Упрощение кода ● Скорость выше, если код проще
  • 22. GIL в python 3.2 ● Первое серьёзное изменение со времён 1992 года ● Вместо счётчика тиков - gil_drop_request ● Также добавлен таймаут в 5мс
  • 27. Какие планы по GIL Его заменят, если новый подход будет: ● простым ● увеличит скорость для многопоточных программ ● не изменит скорость для однопоточных ● будет совместим с текущим API ядра ● оставит такое же поведение GC
  • 28. Как обойти GIL ● Для IO этого делать не надо ● Использовать специализированные библиотеки: https://wiki.python.org/moin/ParallelProcessing (например scipy) ● Использовать другие интерпретаторы ● Использовать multiprocessing
  • 29. Использовать другие интерпретаторы Последовательное 2 потока (2 ядра) 4 потока (4 ядра) jython 2.5.3 (Gentoo, i3 3Ghz) 10.70 8.65 (x1.24) 6.85 (x1.56) pypy 2.0.2 (Gentoo, i3 3Ghz) 2.75 2.85 2.90
  • 30. Multiprocessing from multiprocessing import Process, Pipe … def store_odd_primes(pipe_conn, max_number, start_number=3): storage = [] for num in range(start_number, max_number + 1, 2): if is_odd_prime(num): storage.append(num) pipe_conn.send(storage) numbers = [2] parent_conn, child_conn = Pipe() proc1 = Process(target=store_odd_primes, args=(child_conn, 20000, )) proc2 = Process(target=store_odd_primes, args=(child_conn, 40000, ), kwargs={'start_number': 20001}) proc1.start();proc2.start();proc1.join();proc2.join() numbers += parent_conn.recv() numbers += parent_conn.recv() print len(numbers)
  • 31. Multiprocessing Последовательное 2 процесса (2 ядра) 4 потока (4 ядра) python 2.6.8 (Gentoo, i3 3Ghz) 3.80 2.80 (x1.35) 2.08 (x1.83) python 3.2.5 (Gentoo, i3 3Ghz) 5.05 3.68 (x1.37) 3.10 (x1.63) pypy 2.0.2 (Gentoo, i3 3Ghz) 0.50 0.42 (x1.20) 0.33 (x1.55)
  • 32. Выводы ● Параллельной многопоточности в Python по умолчанию нет ● Она частично существует для специализированных расширений и операций IO ● GIL почти никогда не мешает ● А когда мешает мы знаем как с этим бороться