Многопоточное программирование
Процесс?
Процесс – программа, которая запущена в ОП компьютера.
- Характеристики процесса:
- Идентификатор процесса PID
- Объем ОП
- Стек (стек используется для вызова функций, для создания локальных переменных этих функций)
- Список открытых файлов
- Ввод/вывод
ПОТОКИ
- Поток напоминает процесс
- У потока своя последовательность инструкции
- Каждый поток имеет собственный стек
- Все потоки выполняются в рамках процесса(делят его память и ресурсы)
- Управлением выполнением потоков занимается ОС
- Потоки в питоне имеют свои ограничения
Много поточность
Способность процесса выполнять несколько потоков параллельно , называется многопоточностью.
Плюсы
Минусы
- Повышает скорость вычислений (каждое ядро или процессор обрабатывает отдельный поток одновременно)
- Позволяет программе оставаться отзывчивым в то время как один поток ожидает ввода, в другой работает граф интерфейс
- Поток имеет глобальные и локальные переменные
- На однопроцессорной системе много поточность не влияет на скорость вычислений
- Синхронизация, чтобы избежать взаимного исключения при доступе к общим ресурсам (загрузка процессора)
- Увеличивается сложность программы
Python предлагает два модуля для реализации threads в программах.
- модуль
- модуль .
модуль является устаревшим в Python 3 и переименован в модуль для обратной совместимости.
Основное различие между этими двумя модулями является то, что модуль реализует нить как функцию. С другой стороны, модуль предлагает объектно-ориентированный подход для обеспечения возможности создания потоков.
Модуль также представляет класс
имеет следующие методы:
Создание класса потоков и объектов для печати текущей даты
Модуль имеет встроенные функциональные возможности для осуществления блокировки, что позволяет синхронизировать потоки. Блокировка требуется для управления доступом к общим ресурсам для предотвращения повреждения или непринятых данных.
Вы можете вызвать метод Lock() , чтобы применять блокировки , он возвращает новый объект блокировки . Затем, вы можете вызвать метод acquire(blocking) объекта блокировки для обеспечения синхронного выполнения потоков .
Очередь
Поиск слов
в файлах
Класс RLock - вариант простой блокировки, которая блокирует поток только в том случае, если блокировка захвачены другим потоком
если требуется использовать несколько условных переменных для синхронизации доступа к одному ресурсу.
Семафоры
Семафоры - более сложный и совершенный механизм блокировок. Внутри семафора - счетчик, в отличии от объекта блокировки, в которой просто флажок.
Семафор блокирует поток только когда более заданного числа потоков пытаются захватить семафор.
GIL
- GIL – глобальная блокировка интерпретатора(GLOBAL INTERPRETER LOCK)
Эта штука позволяет одновременно запускать только один питоновский поток — остальные обязаны ждать переключения GIL на них.
У нас есть поток, в котором выполняется наш Python код, и каждый раз Python интерпретатор пробует получить глобальную блокировку интерпретатора.
- Поток, владеющий GIL, не отдает его пока об этом не попросят.
- Потоки засыпают на 5 мс. для ожидания GIL.
- Сам GIL устроен как обычная нерекурсивная блокировка. Эта же структура лежит в основе threading.Lock.
Когда Python делает системный вызов или вызов из внешней библиотеки он отключает механизм GIL.
После того как функция вернет управление снова включает его.
Т.е. потоки при своем выполнении так или иначе вынуждены получать GIL.
Именно поэтому многопоточные программы, требующие больших вычислений,
могут выполняться медленней чем однопоточные.