SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
Введение в потоки
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 почти никогда не мешает
● А когда мешает мы знаем как с этим
бороться
Спасибо.

Weitere ähnliche Inhalte

Was ist angesagt?

Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияMichael Pankov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питонаAndrey Niahajchyk
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Ontico
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...Ontico
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 

Was ist angesagt? (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
 

Ähnlich wie Введение в GIL и новый GIL

ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3it-people
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)IT-Доминанта
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...Ontico
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Fwdays
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Cisco Russia
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийAndrey Akinshin
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsSergey Schetinin
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptFDConf
 
Параллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахПараллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахAlex Tutubalin
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиFProg
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 

Ähnlich wie Введение в 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
 

Mehr von Python Meetup

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] Python Meetup
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython 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.2014Python Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиPython Meetup
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаPython Meetup
 

Mehr von 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: от первого коммита до продакшена
 

Введение в 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 почти никогда не мешает ● А когда мешает мы знаем как с этим бороться