⚙️ Конкурентное программирование в Go
Конкурентность --- это возможность выполнять несколько задач одновременно. Go делает это проще благодаря встроенным примитивам и автоматическому управлению планировщиком.
🧵 Что такое конкурентность?
Обычный код выполняется построчно, одна инструкция за раз. Конкурентный код позволяет нескольким частям программы выполняться:
- параллельно --- одновременно на разных ядрах процессора,
- асинхронно --- выполнение может приостанавливаться и возобновляться.
Go автоматически решает, какой режим использовать.
🧠 Потоки (threaded execution)
На многоядерных системах разные куски работы могут быть распределены между ядрами. Основная идея:
- Каждое ядро выполняет свой фрагмент
- Планировщик Go распределяет задачи между ядрами самостоятельно
🔄 Асинхронное выполнение
Асинхронный код способен:
- приостанавливаться,
- освобождать поток,
- возобновляться позже.
Пока одна задача ждёт (например, сеть или диск), другие продолжают выполняться.
🎲 Недетерминированность
Обычный однопоточный код ведёт себя детерминированно: результаты всегда одинаковы.
Конкурентный код:
- выполняется не по порядку,
- результаты могут зависеть от планировщика,
- требует синхронизации, если нужен строгий порядок.
🚀 Почему конкурентность полезна?
- Полное использование всех доступных CPU-ресурсов
- Параллелизация вычислений
- Асинхронное выполнение операций ввода-вывода
- Возможность эффективной обработки множества задач одновременно
🧰 Как работает конкурентность в Go?
Go предоставляет универсальный механизм, который скрывает различия между
потоками и асинхронностью.
Программист работает с горутиной --- лёгкой задачей, запускаемой через
go:
go doWork()
Go решает:
- запускать это параллельно,
- или асинхронно,
- или переключать задачи между потоками.
💡 Итоги
- Конкурентность позволяет выполнять несколько задач одновременно.
- Может работать через параллелизм (несколько ядер) или асинхронность (ожидание/возобновление).
- Go автоматически управляет потоками и переключением задач.
- Конкурентный код недетерминированный, требует синхронизации при необходимости порядка.
- Используется для производительности, ввода-вывода и распределённых вычислений.