Процессы и потоки в Python
Представьте, что у нас есть простая программа на Python:
Компьютеры языка Python не знают и не понимают. Они понимают толькомашинный код
— набор инструкций из нуля и единиц. Поэтому для выполнения программы на Python необходим интерпретатор, который переводит Python-код в машинный код.
Когда вы запускаете какой-нибудь скрипт на Python — например, app.py — интерпретатор Python (CPython) компилирует app.py в машинный код.
Операционная система (ОС) должна загрузить программу в память (RAM), чтобы запустить ее.
Как только ОС загружает программу в память, она по шине перемещает инструкции в центральный процессор для выполнения.
В общем случае ОС перемещает инструкции в очередь, также известную как конвейер. Затем центральный процессор выполняет инструкции из конвейера.
Процесс — это экземпляр программы, выполняемой на компьютере.
Поток — это единица выполнения внутри процесса.
Обратите внимание, что если вы запускаете программу несколько раз, у вас будет одна программа, но несколько процессов, которые являются экземплярами этой программы.
На следующем рисунке показан процесс выполнения программы Python на компьютере:
До сих пор мы в наших статьях разрабатывали программы с одним процессом и одним потоком. В таких ситуациях термины процесс и поток взаимозаменяемы.
У программы может быть один или несколько процессов, а у процесса может быть один или несколько потоков.
Когда у программы несколько процессов, это называется мультпроцессингом. Если у программы несколько потоков, это называется многопоточностью.
Одноядерные процессоры¶
Раньше у процессоров было только по одному ядру. Это означало, что один процессор одновременно может выполнять только один процесс. Для выполнения нескольких процессов как бы «одновременно» ОС использовала программный компонент — планировщик:
Планировщик похож на переключатель, который управляет планированием процессов. Основная задача планировщика — регулярно выбирать инструкции и отправлять их на выполнение. Планировщик переключается между процессами настолько быстро (около 1 мс), что вам кажется, что компьютер может выполнять несколько процессов одновременно.
Многоядерные процессоры¶
Сегодня у центрального процессора обычно несколько ядер: например, два ядра (тогда он двухъядерный) или четыре ядра (тогда он четырехъядерный).
Количество ядер определяет количество процессов, которые ЦП может выполнять одновременно. Как правило, чем больше ядер у процессора, тем больше процессов он может выполнять одновременно.
Например, двухъядерный процессор может одновременно выполнять ровно два процесса, а четырехъядерный — не более четырех.
При многопроцессорной обработке используется многоядерный процессор в рамках одного компьютера, который действительно выполняет несколько процессов параллельно.
Задачи, привязанные к процессору, и задачи, привязанные к вводу/выводу¶
Все программы выполняют два типа задач: связанные с вводом-выводом (I/O-bound) или связанные с процессором (CPU-bound).
-
Процессы, связанные с вводом/выводом, тратят больше времени на ввод/вывод, чем на вычисления. Примеры: сетевые запросы, соединения с базами данных, ввод/вывод файлов.
-
Процессы, привязанные к процессору, тратят больше времени на вычисления, чем на запросы ввода-вывода. Примеры: умножение матриц, поиск простых чисел, сжатие видео, потоковое видео.
Технически, многопоточность подходит для процессов, связанных с вводом/выводом, а многопроцессорность — для процессов, связанных с процессором.
Отличия процесса и потока¶
В следующей таблице показаны основные различия между процессом и потоком
Что нужно запомнить¶
- Процесс — это экземпляр программы, запущенной на компьютере.
- У программы может быть один или несколько процессов.
- Поток — это единица выполнения в процессе.
- У процесса может быть один или несколько потоков.