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