Конкурентность не равна одновременному вычислению
Конкурентная программа управляет несколькими незавершёнными задачами. Параллельное выполнение означает, что работа действительно идёт одновременно на нескольких вычислительных ресурсах. Представьте обработку трёх заказов: исполнитель может переключаться, пока один заказ ожидает ответ, даже оставаясь единственным работником. Несколько исполнителей дают другую организацию. Такая аналогия помогает понять различие, но не заменяет измерений. Если почти всё время занимает один непрерывный расчёт, простое переключение задач не создаёт дополнительной вычислительной мощности.
Асинхронность использует моменты ожидания
В типичной модели asyncio цикл событий управляет задачами, которые уступают выполнение в подходящих точках ожидания. Пока одна операция ждёт данные, может продолжаться другая. Для этого используемые операции должны поддерживать соответствующий способ взаимодействия. Длительный блокирующий вызов внутри такого пути способен задержать остальные задачи. Поэтому добавление слов async и await само по себе не превращает произвольный код в эффективную асинхронную систему. Важны границы операций, обработка отмены, ограничения числа одновременно начатых запросов и корректное завершение ресурсов.
Потоки разделяют память, процессы изолируют её
Потоки одного процесса используют общее адресное пространство, что удобно для обмена данными, но требует внимания к совместному изменению состояния. Процессы обычно имеют отдельную память; результаты передают через специальные механизмы, и такая передача имеет стоимость. В сборках CPython с включённой глобальной блокировкой интерпретатора потоки не обеспечивают одновременное исполнение обычного Python-кода на нескольких ядрах. При этом существуют сборки без этой блокировки, а некоторые расширения освобождают её. Поэтому вывод о производительности зависит от среды и библиотек, а не только от названия языка.
Правильная модель проверяется измерением
Для выбора полезно разделить программу на получение данных, вычисление и сохранение результата. Каждый этап может иметь своё ограничение. Если обработка короткая, расходы на запуск процессов и передачу объектов способны перекрыть пользу. Если все задачи обращаются к одному медленному ресурсу, увеличение числа работников не устраняет само ограничение. Также нужно учитывать ошибки: результат должен содержать понятное соответствие исходной задаче, а не зависеть от случайного порядка завершения. Хороший эксперимент сравнивает одинаковые входные данные, проверяет правильность ответа и только затем оценивает время.
Попробуйте на практике
Составьте план выполнения вымышленной программы без запуска сетевых запросов и установки библиотек.
- Опишите три операции: ожидание ответа сервиса, расчёт по независимым наборам чисел и запись общего отчёта.
- Для каждой отметьте предполагаемое ограничение: ожидание, вычисления или доступ к общему ресурсу.
- Предложите подходящую модель организации и запишите цену координации: синхронизацию памяти, передачу данных или требования к неблокирующим операциям.
- Определите, как проверить совпадение результатов и ограничить число одновременно работающих задач в будущем эксперименте.
Как проверить результат. План обоснован, если модель связана с характером операции, ограничения среды названы, а обещание ускорения заменено проверяемым сравнением.
Частые вопросы
Асинхронная функция автоматически работает на другом ядре?
Нет. Асинхронность описывает организацию ожидания и переключения задач. Само объявление функции не создаёт отдельный процесс и не гарантирует параллельное вычисление.
Почему больше процессов иногда означает более медленную программу?
Создание работников, передача данных и сбор результатов требуют ресурсов. Для коротких задач эти расходы могут оказаться больше времени полезной работы.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.