Python: GIL MultiThreading Stacy Khomenko, GlobalLogic

advertisement
Python: GIL
MultiThreading
Stacy Khomenko, GlobalLogic
Многопоточность
Multithreading
Потоки нужны для произведения
параллельных вычислений
Потоки нужно:
• Создавать
• Ожидать
• Завершать
Совместное использование
ресурсов
•
•
•
•
Взаимоисключения (mutex)
Критическая секция (fast mutex, futex)
Семафоры (пул ресурсов)
События
Изменяемые объекты
• Неизменяемые
• Изменяемые, не имеющие представления о
потоках
• Мониторы
• Активные объекты
Mutex
Мониторы
Thread Pools – concurrent.futures
Новинка Python 3.2
future - отложенное значение
Активные объекты
Global Interpreter Lock
Global Interpreter Lock
Global Interpreter Lock (GIL) - особый
алгоритм мьютекса (лока), накладываемый
на поток интерпретатора для исключения
одновременного
потоково-небезопасного
доступа к общим ресурсам.
Global Interpreter Lock
• GIL используется в Cpython, Ruby, PHP
• GIL в Python v.2.x и v.3.2 различается
существенно
• Python branches 2.x и v.3.x – обратно
несовместимы
GIL in Python 2.x
GIL in Python 2.x
• Одновременно исполняется лишь поток
интерпретатора
• 100 тиков (инструкций)
• Освобождается на время операций вводавывода, простых арифметических операций
GIL in Python 2.x – 1 CPU
GIL in Python 2.x
Последовательный запуск
Выполнение отнимает 13 sec
GIL in Python 2.x – N CPU
Параллельный запуск на 2х процессорном PC
Выполнение отнимает 30 sec
GIL in Python 2.x – N CPU
Проблема Control-C
GIL in Python 2.x – N CPU
• Слишком много сигналов
• CPU-потоки блокируют IO-потоки (неверная
расстановка приоритетов)
Почему такой алгоритм GIL?
Guido van Rossum: “…
• Нужно переписать половину интерпетатора
– трудоемко
• В результате замедлится выполнение всех
инструкций Python – бессмысленно
• Используйте модули ‘processing’,
parallelpython, Pypar, pyMPI
• Возьмите Jython, IronPython, etc и боритесь
с dead-lock’ами…”
GIL in Python 3.2
GIL in Python 3.2
• Тайм-аут для переключения между
потоками (5 ms) вместо количества
операций (100)
• Рабочая приоритетизация
• Существенное уменьшение количества
сигналов и другого “мусора”
GIL in Python 3.2
Теперь необходимо 21 sec в обоих случаях
GIL in Python 3.2
Выводы
• Python v.3.2 GIL работает
существенно эффективнее
• В Python многопоточность
возможна!
Thank you
This presentation was made using researches of David Beazley
and Andrew Svetlov
Download