Автор: Андрей Нехайчик (Wargaming.net | COOO «Гейм Стрим»)
— Треды, отличия от потоков.
— Как использовать треды.
— Тестирование производительности (и облом).
— Представление GIL, как он работает.
— Освобождение по I/O, 100 тиков.
— Зачем нужен GIL.
— Проблемы переключения потоков (медленный захват).
— Проблема 100 тиков.
— Проблема отсутствия приоритетов и их типов.
— Новый GIL, 5 миллисекунд, drop_request.
— Когда drop_request не работает.
— Соревнование CPU и I/O тредов.
— Как борются с GIL: тезисы о numpy, Jython, multiprocessing.
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
Отличия от процессов
● поток – наименьшая единица обработки
● поток – составной элемент процесса
● потоки работают в едином адресном
пространстве
● потоки “дешевле” и, обычно, ОС проще
ими манипулировать
11. Потоки в Python
● Существует GIL и гарантирует
последовательное выполнение байткода
● Каждые 100 тиков: освобождение и захват
GIL
● 1 тик – одна или более инструкций
байткода
● IO освобождает GIL
● Си-модули могут освобождать GIL
● Освобождение и захват GIL –
дополнительные накладные расходы
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
32. Выводы
● Параллельной многопоточности в Python
по умолчанию нет
● Она частично существует для
специализированных расширений и
операций IO
● GIL почти никогда не мешает
● А когда мешает мы знаем как с этим
бороться