Найти в Дзене

Знакомство с конкурентностью

Конкурентность - это выполнение сразу нескольких действий в одно и то же время. Приложения для конечного пользователя используют конкурентность, чтобы реагировать на ввод данных пользователем во время записи в базу данных. Серверные приложения используют конкурентность для реакции на второй запрос в ходе завершения первого запроса. В общем и целом конкурентность - это любая ситуация, когда во время работы над чем-то одним приходится работать еще и над чем-то другим. Многие специалисты, когда слышат о конкуренции, сразу вспоминают о многопоточности, но это немного разные понятия. Многопоточность - Форма конкурентности, использующая несколько программных потоков выполнения. Важно! Как только вы вводите команду new Thread(), все кончено: ваш проект уже содержит устаревший код. Многопоточность не умерла, она эволюционировала. Многопоточность продолжает жить в пулах потоков — полезном месте для постановки рабочих операций в очередь, которое автоматически регулируется в зависимости от нагруз

Конкурентность - это выполнение сразу нескольких действий в одно и то же время.

Приложения для конечного пользователя используют конкурентность, чтобы реагировать на ввод данных пользователем во время записи в базу данных. Серверные приложения используют конкурентность для реакции на второй запрос в ходе завершения первого запроса.

В общем и целом конкурентность - это любая ситуация, когда во время работы над чем-то одним приходится работать еще и над чем-то другим.

Многие специалисты, когда слышат о конкуренции, сразу вспоминают о многопоточности, но это немного разные понятия.

Многопоточность - Форма конкурентности, использующая несколько программных потоков выполнения.

Важно! Как только вы вводите команду new Thread(), все кончено: ваш проект уже содержит устаревший код.

Многопоточность не умерла, она эволюционировала.

Многопоточность продолжает жить в пулах потоков — полезном месте для постановки рабочих операций в очередь, которое автоматически регулируется в зависимости от нагрузки. В свою очередь, с пулом потоков становится возможной одна важная форма конкурентности: параллельная обработка.

Параллельная обработка - это выполнение большого объема работы за счет распределения ее между несколькими потоками, выполняемыми одновременно.

Пример параллельной обработки
Пример параллельной обработки

Параллельная обработка (или параллельное программирование) использует многопоточность для максимально эффективного использования многоядерных процессоров.

Параллельная обработка является одной из разновидностей многопоточности, а многопоточность является одной из разновидностей конкурентности. Также существует другая разновидность конкурентности, которая важна в современных приложениях: асинхронное программирование.

Асинхронное программирование Разновидность конкурентности, использующая обещания или обратные вызовы для предотвращения создания лишних потоков.

Жизненный пример асинхронного и параллельного программирования
Жизненный пример асинхронного и параллельного программирования

Обещание (future/promise), или преднамеченный тип — тип, представляющий некоторую операцию, которая завершится в будущем. Примеры современных типов обещаний в .NET — Task и Task. Более старые асинхронные API используют обратные вызовы или события вместо обещаний. В асинхронном программировании центральное место занимает идея асинхронной операции — некоторой запущенной операции, которая завершится через некоторое время. Хотя операция продолжается, она не блокирует исходный поток; поток, который запустил операцию, свободен для выполнения другой работы. Когда операция завершится, она уведомляет свое обещание или активизирует обратный вызов или событие, чтобы приложение узнало о завершении.

Асинхронное программирование — мощная разновидность конкурентности, оно до недавнего времени требовало чрезвычайно сложного кода. Благодаря поддержке async и await в современных языках асинхронное программирование становится почти таким же простым, как и синхронное (неконкурентности) программирование.

Другая форма конкурентности — реактивное программирование (reactive programming). Асинхронное программирование подразумевает, что приложение запускает операцию, которая завершится в будущем. Реактивное программирование тесно связано с асинхронным программированием, но в его основе лежат асинхронные события вместо асинхронных операций.

Обычно при написании конкурентной программы применяется комбинация разных методов. В большинстве приложений используется как минимум многопоточность (через пул потоков) и асинхронное программирование. Вы можете свободно смешивать разные формы конкурентности, используя подходящий инструмент для каждой части приложения.