Процесс и поток: в чём разница
Разбираемся, что такое процесс, что такое поток и почему это разные вещи.
Процесс — это выполняющаяся программа со своим изолированным адресным пространством памяти; поток — отдельная линия исполнения внутри процесса, разделяющая его память с другими потоками.
Когда вы запускаете программу, операционная система создаёт процесс: выделяет ему память, открывает доступ к файлам и даёт хотя бы один поток исполнения. Процесс — это «коробка» с ресурсами. Внутри коробки бегает как минимум один поток — именно поток выполняет инструкции по одной.
Что у процесса своё, а что общее у потоков
Главное отличие — память. У каждого процесса своё адресное пространство: процесс A не может случайно прочитать переменные процесса B. Это даёт изоляцию и безопасность, но обмен данными между процессами стоит дорого (нужны специальные каналы).
Потоки внутри одного процесса, наоборот, делят общую память. Все они видят одни и те же глобальные переменные и кучу (heap). Это делает обмен данными почти бесплатным — но именно отсюда растут состояния гонки, о которых мы поговорим позже.
| Что | Процесс | Поток |
| Адресное пространство | своё, изолированное | общее с другими потоками |
| Создание | дорогое | дешёвое |
| Обмен данными | через IPC (каналы, очереди) | через общие переменные |
| Падение одного | не роняет другие процессы | может уронить весь процесс |
Зачем вообще нужны потоки
Представьте текстовый редактор. Один поток принимает нажатия клавиш, другой в фоне проверяет орфографию, третий каждые 30 секунд сохраняет файл. Если бы всё это делал один поток последовательно, проверка орфографии «подвешивала» бы ввод текста. Потоки позволяют разнести задачи и держать интерфейс отзывчивым.
import threading
def save_file():
print("Автосохранение...")
# поток внутри того же процесса, общая память
t = threading.Thread(target=save_file)
t.start()
t.join()Этот код использует реальные потоки ОС, поэтому в браузере мы его не запускаем — он помечен как текст. Дальше в курсе вы увидите, почему в Python потоки ведут себя особенно.
Как работает под капотом
Поток — это для операционной системы единица планирования. У каждого потока свой стек вызовов и свой счётчик команд (где он сейчас в коде), но куча и глобальные данные — общие. Когда ОС решает дать процессорное время другому потоку, она сохраняет регистры текущего потока и загружает регистры следующего. Этот момент мы подробно разберём в уроке про контекстное переключение.
Создание процесса требует копирования адресного пространства (или хитрого copy-on-write), поэтому оно тяжелее. Создание потока — это просто новый стек и запись в таблице потоков, поэтому потоки «легче».
Частые ошибки
- Путать процесс и поток. «Программа = процесс, линия исполнения = поток». Программа может иметь много потоков, но это всё ещё один процесс.
- Думать, что потоки изолированы. Нет: они делят память, и это источник самых коварных багов.
- Считать, что больше потоков = всегда быстрее. Переключение между потоками тоже стоит времени.
Итог
- Процесс — изолированная «коробка» с памятью и ресурсами.
- Поток — линия исполнения внутри процесса; потоки делят память.
- Потоки дешевле процессов, но общая память порождает гонки.
- Падение потока может уронить весь процесс; падение процесса другие не задевает.