Асинхронное против синхронного выполнения, что это действительно означает?
В чем разница между асинхронным и синхронным выполнением?
20 ответов
Когда вы выполняете что-то синхронно, вы ждете, пока оно завершится, прежде чем переходить к другой задаче. Когда вы выполняете что-то асинхронно, вы можете перейти к другой задаче до ее завершения.
При этом в контексте компьютеров это приводит к выполнению процесса или задачи в другом "потоке". Поток - это набор команд (блок кода), который существует как единица работы. Операционная система может управлять несколькими потоками и назначать потоку часть ("срез") процессорного времени перед переключением на другой поток, чтобы дать ему возможность выполнить некоторую работу. По своей сути (простите за каламбур) процессор может просто выполнить команду, он не имеет понятия, что нужно делать две вещи одновременно. Операционная система имитирует это, выделяя отрезки времени различным потокам.
Теперь, если вы введете в процесс несколько ядер / процессоров, тогда вещи МОГУТ происходить одновременно. Операционная система может выделять время одному потоку на первом процессоре, а затем выделять такой же блок времени другому потоку на другом процессоре. Все это позволяет операционной системе управлять выполнением вашей задачи, в то время как вы можете продолжать работу в своем коде и заниматься другими делами.
Асинхронное программирование - сложная тема из-за семантики того, как вещи связаны друг с другом, когда вы можете делать их одновременно. Есть множество статей и книг на эту тему; посмотри!
Синхронный / Асинхронный НИЧЕГО НЕ СДЕЛАТЬ С МНОГОСТОРОННИМ.
Синхронный или Синхронизированный означает в некотором роде "связанный" или "зависимый". Другими словами, две синхронные задачи должны быть осведомлены друг о друге, и одна задача должна выполняться каким-либо образом, зависящим от другой, например, ждать, пока не выполнится другая задача.
Асинхронный означает, что они полностью независимы, и ни один из них не должен учитывать другого каким-либо образом, ни при инициации, ни при исполнении.
Синхронный (один поток):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Синхронный (многопоточный):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Асинхронный (один поток):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Асинхронный (многопоточный):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
- Начальная и конечная точки задач A, B, C представлены
<
,>
персонажи. - Срезы ЦП, представленные вертикальными полосами
|
Технически, концепция синхронного / асинхронного действительно не имеет ничего общего с потоками. Хотя, как правило, найти асинхронные задачи, выполняющиеся в одном и том же потоке, необычно, это возможно (см. Примеры ниже), и обычно можно найти две или более задач, выполняющихся синхронно в отдельных потоках... Нет, концепция синхронный / асинхронный связан исключительно с тем, может ли вторая или последующая задача быть инициирована до того, как другая (первая) задача завершена, или же она должна ждать. Это все. Какой поток (или потоки), или процессы, или процессоры, или действительно, на каком оборудовании выполняются задачи, не имеет значения. Действительно, чтобы подчеркнуть это, я отредактировал графику, чтобы показать это.
АСИНХРОННЫЙ ПРИМЕР. При решении многих инженерных задач программное обеспечение предназначено для разделения общей проблемы на несколько отдельных задач, а затем выполнять их асинхронно. Хорошими примерами являются инвертирование матрицы или проблема анализа методом конечных элементов. В вычислениях сортировка списка является примером. Например, процедура быстрой сортировки разбивает список на два списка и сортирует каждый из них, вызывая себя рекурсивно. В обоих приведенных выше примерах две задачи могут (и часто выполняются) выполняться асинхронно. Они не должны быть в отдельных потоках. Даже машина с одним ЦП и только одним потоком выполнения может быть закодирована, чтобы инициировать обработку второй задачи до завершения первой. Единственным критерием является то, что результаты одной задачи не являются необходимыми в качестве входных данных для другой задачи. Поскольку время начала и окончания задач перекрываются (возможно только в том случае, если выходные данные одного из них необходимы в качестве входных данных для другого), они выполняются асинхронно, независимо от того, сколько потоков используется.
СИНХРОННЫЙ ПРИМЕР. Любой процесс, состоящий из нескольких задач, где задачи должны выполняться последовательно, но одна должна выполняться на другом компьютере (выборка и / или обновление данных, получение котировки акций из финансовой службы и т. Д.). Если он находится на отдельной машине, он находится в отдельном потоке, будь то синхронный или асинхронный.
Проще говоря:
Синхронная
Вы находитесь в очереди, чтобы получить билет в кино. Вы не можете получить его, пока все перед вами не получат его, и то же самое относится к людям, стоящим в очереди за вами.
АСИНХРОННЫЙ
Вы находитесь в ресторане со многими другими людьми. Вы заказываете еду. Другие люди также могут заказать еду, им не нужно ждать, пока ваша еда будет приготовлена и подана вам, прежде чем они смогут заказать. На кухне работники ресторана постоянно готовят, подают и принимают заказы. Люди получат еду, как только она будет приготовлена.
Я постараюсь объяснить как можно проще, чтобы вы (надеюсь) запомнили:
Синхронное выполнение
Мой босс занятой человек. Он говорит мне, чтобы написать код. Я говорю ему: хорошо. Я начинаю, и он наблюдает за мной, как стервятник, стоящий позади меня, с моего плеча. Я как "Чувак, WTF: почему бы тебе не пойти и не сделать что-нибудь, пока я закончу это?"
он говорит: "Нет, я жду прямо здесь, пока ты не закончишь". Это синхронно.
Асинхронное выполнение
Босс говорит мне сделать это, и вместо того, чтобы ждать моей работы, босс уходит и выполняет другие задачи. Когда я заканчиваю свою работу, я просто сообщаю своему боссу и говорю: "Я СДЕЛАН!" Это асинхронное выполнение.
Это действительно так просто! Надеюсь, поможет.
(Примите мой совет: НИКОГДА не работайте с боссом позади вас.)
Синхронное выполнение означает, что выполнение происходит в одной серии. A->B->C->D
, Если вы вызываете эти процедуры, A
побежит, потом закончу, потом B
начну, потом закончу, потом C
начнется и т. д.
С асинхронным выполнением вы запускаете подпрограмму и запускаете ее в фоновом режиме, а затем начинаете следующее, а затем в какой-то момент говорите "дождитесь завершения". Это больше похоже на:
Начните A->B->C->D->
Ждать A
заканчивать
Преимущество в том, что вы можете выполнить B
, C
и или D
в то время как A
все еще работает (в фоновом режиме, в отдельном потоке), так что вы можете лучше использовать свои ресурсы и иметь меньше "зависаний" или "ожиданий".
Короче говоря, синхронизация относится к двум или более точкам начала и конца процессов, а НЕ к их выполнению. В этом примере конечная точка процесса A синхронизируется с начальной точкой процесса B:
Синхронная | -------- --------| |--------B--------|
Асинхронные процессы, с другой стороны, не синхронизируют свои начальные и конечные точки:
АСИНХРОННЫЙ | -------- -------- | | -------- B -------- |
Там, где процесс A перекрывает процесс B, они работают одновременно или синхронно (определение словаря), что приводит к путанице.
ОБНОВЛЕНИЕ: Чарльз Бретана улучшил свой ответ, так что этот ответ теперь является простой (потенциально упрощенно) мнемоникой.
Синхронный означает, что вызывающий ожидает ответа или завершения, асинхронный, что вызывающий продолжается, и ответ приходит позже (если применимо).
В качестве примера:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Это всегда будет выводиться:
Before call
In call
After call
Но если мы сделаем doSomething асинхронным (несколько способов сделать это), то результатом может стать:
Before call
After call
In call
Потому что метод, выполняющий асинхронный вызов, немедленно переходит к следующей строке кода. Я говорю "мог", потому что порядок выполнения не может быть гарантирован асинхронными операциями. Он также может выполняться как оригинал, в зависимости от времени потоков и т. Д.
Модель синхронного программирования - поток назначается одной задаче и начинает работать над ней. Когда задача завершена, она становится доступной для следующей задачи. В этой модели он не может оставить выполняющуюся задачу в середине для выполнения другой задачи. Давайте обсудим, как эта модель работает в однопоточных и многопоточных средах.
Однопотоковый - если у нас есть пара задач, над которыми нужно работать, и текущая система предоставляет только один поток, тогда задачи назначаются потоку одна за другой. Это может быть наглядно изображено как
Многопоточный - В этой среде у нас было несколько потоков, которые могут выполнять эти задачи и начинать работать над этим. Это означает, что у нас есть пул потоков (новые потоки также могут быть созданы на основе требований и доступных ресурсов) и куча задач. Так что эти темы могут работать на них как
Модель асинхронного программирования - в отличие от модели синхронного программирования, здесь поток, однажды начав выполнять задачу, может удерживать ее в середине, сохранить текущее состояние и начать выполнение другой задачи.
Подробнее здесь - https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/
Я думаю, что это немного приблизительное объяснение, но все же оно проясняет пример из жизни.
Маленький пример:
Допустим, воспроизведение аудио включает три этапа:
- Получение сжатой песни с жесткого диска
- Распакуйте аудио.
- Воспроизведение несжатого аудио.
Если ваш аудиоплеер делает шаг 1,2,3 последовательно для каждой песни, то это синхронно. Вам придется подождать некоторое время, чтобы услышать песню, пока песня действительно не будет извлечена и распакована.
Если ваш аудиоплеер выполняет шаги 1,2,3 независимо друг от друга, то он асинхронный. то есть. Во время воспроизведения аудио 1 (шаг 3), если он извлекает аудио 3 с жесткого диска параллельно (шаг 1) и распаковывает аудио 2 параллельно. (шаг 2) В итоге вы услышите песню, не дожидаясь извлечения и распаковки.
Я создал gif для объяснения этого, надеюсь, будет полезным: посмотрите, строка 3 асинхронная, а другие синхронные. все строки перед строкой 3 должны ждать, пока строка не закончит свою работу, но из-за того, что строка 3 асинхронна, следующая строка (строка 4) не ждет строки 3, но строка 5 должна ждать, пока строка 4 завершит свою работу, и строка 6 должна ждать строки 5 и 7 для 6, потому что строки 4,5,6,7 не являются асинхронными.
Проще говоря, асинхронное выполнение делает вещи в фоновом режиме.
Например, если вы хотите загрузить файл из Интернета, вы можете использовать для этого синхронную функцию, но она заблокирует ваш поток до завершения загрузки файла. Это может сделать ваше приложение невосприимчивым к любому пользовательскому вводу.
Вместо этого вы можете загрузить файл в фоновом режиме, используя асинхронный метод. В этом случае функция загрузки немедленно возвращается и выполнение программы продолжается в обычном режиме. Все операции загрузки выполняются в фоновом режиме, и ваша программа будет уведомлена, когда она будет завершена.
Как на самом деле простой пример,
Синхронная
Представьте, что 10 школьников проинструктированы ходить по дороге как очередь.
Третий студент развязал шнурки. Теперь она остановилась и снова связывалась.
Все ученики позади нее остановились и теперь ждут, чтобы она завязала это. 1-й и 2-й студенты прошли мимо всех них и продолжили в обычном темпе.
10-->9-->8-->7-->6-->5-->4-->3. 2-->1-->
АСИНХРОННЫЙ
Представьте себе 10 случайных людей, идущих по одной и той же дороге. Они, конечно, не стоят в очереди, просто случайно ходят по разным местам на дороге в разном темпе.
Шнурок от третьего лица развязался. Она остановилась, чтобы снова связать его.
Но никто не ждет ее, чтобы связать это. Все остальные продолжают идти так же, как и раньше, в том же темпе, что и они.
10--> 9-->
8--> 7--> 6-->
5--> 4--> 3. 2-->
1-->
Синхронный в основном означает, что вы можете выполнять только одну вещь за раз. Асинхронный означает, что вы можете выполнять несколько вещей одновременно, и вам не нужно завершать выполнение текущей вещи, чтобы перейти к следующей.
При выполнении последовательности, такой как: a> b> c> d>, если мы получаем ошибку в середине выполнения, такую как:
a
b
c
fail
Затем мы перезапустим с самого начала:
a
b
c
d
это синхронно
Однако, если у нас есть та же последовательность для выполнения: a> b> c> d>, и у нас есть ошибка в середине:
a
b
c
fail
... но вместо перезапуска с самого начала мы перезапускаем с точки отказа:
c
d
... это известно как асинхронный.
Используйте пример инструкции для приготовления завтрака
- Налить чашку кофе.
- Разогрейте сковороду, затем пожарьте два яйца.
- Обжарить три ломтика бекона.
- Поджарить два куска хлеба.
- Добавьте масло и джем к тосту.
- Налейте стакан апельсинового сока.
Если у вас есть опыт приготовления, вы выполняете эти инструкции асинхронно. Вы начнете разогревать сковороду для яиц, а затем начнете бекон. Вы положили хлеб в тостер, а затем начали яйца. На каждом этапе процесса вы запускаете задачу, а затем переключаете свое внимание на задачи, которые готовы к вашему вниманию.
Приготовление завтрака - хороший пример асинхронной работы, которая не параллельна. Один человек (или поток) может справиться со всеми этими задачами. Продолжая аналогию с завтраком, один человек может приготовить завтрак асинхронно, начав следующую задачу до того, как первая завершится. Кулинария прогрессирует независимо от того, наблюдает ли это кто-то или нет. Как только вы начнете разогревать сковороду для яиц, вы можете начать жарить бекон. Как только бекон начинается, вы можете положить хлеб в тостер.
Для параллельного алгоритма вам понадобится несколько поваров (или потоков). Можно было бы сделать яйца, один - бекон и так далее. Каждый из них будет сосредоточен только на одной задаче. Каждый повар (или нить) будет заблокирован синхронно, ожидая, пока бекон будет готов к переворачиванию, или тост, чтобы хлопнуть.
Ссылка из концепции асинхронного программирования
Вы путаете Синхронный с Параллельным против Серии. Синхронный означает все одновременно. Синхронизированный означает относящийся к каждой другой области, который может означать последовательно или с фиксированным интервалом. Пока программа все делает, она работает последовательно. Получить словарь... вот почему у нас есть несладкий чай. У вас есть чай или подслащенный чай.
Синхронная операция выполняет свою работу перед возвратом к вызывающей стороне.
Асинхронная операция выполняет (большую часть или всю) свою работу после возврата к вызывающей стороне.
Синхронный: когда задача выполняется синхронно, вы ждете завершения задачи, прежде чем переходить к другой задаче. Одна задача зависит от конца другой
Асинхронный: когда задача выполняется асинхронно, вы можете напрямую переключиться на другую задачу, прежде чем предыдущая будет завершена. Одна задача не зависит от другой.
В программировании задачи выполняются в "потоке". Необходимо понимать, что для задач может быть создано несколько потоков, чтобы избежать суммирования в одной очереди.
При этом концепция синхронного и асинхронного не имеет ничего общего с потоками, поэтому я упоминаю об этом потому, что редко можно увидеть задачи, выполняющиеся асинхронно в одном потоке (хотя это технически возможно).
Другое английское определение Synchronize здесь
Координация; комбайн.
Я думаю, что это лучшее определение, чем "Происходить одновременно". Это тоже определение, но я не думаю, что оно соответствует тому, как оно используется в компьютерных науках.
Таким образом, асинхронная задача не координируется с другими задачами, в то время как синхронная задача координируется с другими задачами, поэтому одна задача заканчивается до запуска другой.
Как это достигается, другой вопрос.
Я думаю, что хороший способ думать об этом - это классическая беговая эстафета.
Синхронный: процессы, подобные членам одной команды, не будут выполняться до тех пор, пока они не получат эстафету (конец выполнения предыдущего процесса / бегуна), и, тем не менее, все они действуют синхронно друг с другом.
Асинхронный. Когда процессы, подобные членам разных команд, находятся на одной и той же трассе эстафеты, они будут работать и останавливаться, асинхронно друг с другом, но в пределах одной гонки (общее выполнение программы).
Имеет ли это смысл?
Что касается "одновременного" определения синхронного выполнения (которое иногда сбивает с толку), вот хороший способ понять это:
Синхронное выполнение: все задачи в блоке кода выполняются одновременно.
Асинхронное выполнение: не все задачи в блоке кода выполняются одновременно.
Синхронный означает, что выполнение очереди выполняется по очереди. Предположим, что есть только транспортное средство, которым нужно поделиться между друзьями, чтобы добраться до места назначения по одному транспортному средству.
В асинхронном случае каждый друг может арендовать автомобиль и добраться до места назначения.
Да, синхронный означает в то же время, буквально, это означает делать работу все вместе. несколько человек / объектов в мире могут делать несколько вещей одновременно, но если мы посмотрим на компьютер, он говорит, что синхронный означает, что процессы работают вместе, что означает, что процессы зависят от возврата друг друга, и поэтому они выполняются один за другим в правильной последовательности. В то время как асинхронный означает, что процессы не работают вместе, они могут работать одновременно (если они в многопоточности), но работают независимо.