В чем разница между асинхронным и синхронным выполнением?
В чем разница между асинхронным и синхронным выполнением?
Ответы:
Когда вы выполняете что-то синхронно, вы ждете, пока оно завершится, прежде чем перейти к другой задаче. Когда вы выполняете что-то асинхронно, вы можете перейти к другой задаче до ее завершения.
При этом в контексте компьютеров это приводит к выполнению процесса или задачи в другом «потоке». Поток - это серия команд (блок кода), которая существует как единица работы. Операционная система может управлять несколькими потоками и назначать потоку часть («кусочек») процессорного времени перед переключением на другой поток, чтобы дать ему возможность выполнить некоторую работу. По своей сути (простите за каламбур) процессор может просто выполнить команду, он не имеет понятия о том, чтобы делать две вещи одновременно. Операционная система имитирует это, выделяя отрезки времени различным потокам.
Теперь, если вы введете в процесс несколько ядер / процессоров, то все может произойти одновременно. Операционная система может выделять время одному потоку на первом процессоре, а затем выделять такой же блок времени другому потоку на другом процессоре. Все это позволяет операционной системе управлять выполнением вашей задачи, в то время как вы можете продолжать работу в своем коде и заниматься другими делами.
Асинхронное программирование - сложная тема из-за семантики того, как вещи связаны друг с другом, когда вы можете делать это одновременно. Есть множество статей и книг на эту тему; посмотри!
Синхронный / асинхронный НИЧЕГО НЕ СДЕЛАТЬ С МНОГООБРАЗУЮЩИМ.
Синхронный или Синхронизированный означает в некотором роде «связанный» или «зависимый». Другими словами, две синхронные задачи должны быть осведомлены друг о друге, и одна задача должна выполняться каким-либо образом, зависящим от другой, например, ждать, пока не выполнится другая задача.
Асинхронный означает, что они полностью независимы, и ни один из них не должен учитывать другого каким-либо образом, ни при инициации, ни при исполнении.
Синхронный (один поток):
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--------->|
<
, >
символы.|
Технически, концепция синхронного / асинхронного действительно не имеет ничего общего с потоками . Хотя, как правило, найти асинхронные задачи, выполняющиеся в одном и том же потоке, необычно, это возможно (см. Примеры ниже), и обычно можно найти две или более задач, выполняющихся синхронно в отдельных потоках ... Нет, концепция синхронный / асинхронный связан исключительно с тем, может ли вторая или последующая задача быть инициирована до завершения другой (первой) задачи, или же она должна ждать. Это все. Какой поток (или потоки), или процессы, или процессоры, или действительно, на каком оборудовании выполняются задачи, не имеет значения. Действительно, чтобы подчеркнуть это, я отредактировал графику, чтобы показать это.
АСИНХРОННЫЙ ПРИМЕР:
При решении многих инженерных задач программное обеспечение предназначено для разделения общей проблемы на несколько отдельных задач и последующего их асинхронного выполнения. Хорошими примерами являются инвертирование матрицы или проблема анализа методом конечных элементов. В вычислениях сортировка списка является примером. Например, подпрограмма быстрой сортировки разбивает список на два списка и выполняет быструю сортировку для каждого из них, вызывая себя (быструю сортировку) рекурсивно. В обоих приведенных выше примерах две задачи могут (и часто выполняются) выполняться асинхронно. Они не должны быть в отдельных потоках. Даже машина с одним ЦП и только одним потоком выполнения может быть закодирована, чтобы инициировать обработку второй задачи до завершения первой. Единственным критерием является то, что результаты одной задачи не являются необходимыми в качестве входных данных для другой задачи, Пока время начала и окончания задач перекрываются (возможно только в том случае, если выходные данные одного из них необходимы в качестве входных данных для другого), они выполняются асинхронно, независимо от того, сколько потоков используется.
СИНХРОННЫЙ ПРИМЕР:
Любой процесс, состоящий из нескольких задач, где задачи должны выполняться последовательно, но одна должна выполняться на другом компьютере (выборка и / или обновление данных, получение котировки акций из финансовой службы и т. Д.). Если он находится на отдельной машине, он находится в отдельном потоке, будь то синхронный или асинхронный.
Проще говоря:
Синхронная
Вы находитесь в очереди, чтобы получить билет в кино. Вы не можете получить его, пока все перед вами не получат его, и то же самое относится к людям, стоящим в очереди за вами.
АСИНХРОННЫЙ
Вы находитесь в ресторане со многими другими людьми. Вы заказываете еду. Другие люди также могут заказать еду, им не нужно ждать, пока ваша еда будет приготовлена и подана вам, прежде чем они смогут заказать. На кухне работники ресторана постоянно готовят, подают и принимают заказы. Люди получат еду, как только она будет приготовлена.
Синхронное выполнение
Мой босс занятой человек. Он говорит мне, чтобы написать код. Я говорю ему: хорошо. Я начинаю, и он наблюдает за мной, как стервятник, стоящий позади меня, с моего плеча. Я как "Чувак, WTF: почему бы тебе не пойти и не сделать что-нибудь, пока я закончу это?"
он как: «Нет, я жду прямо здесь, пока ты не закончишь». Это синхронно.
Асинхронное выполнение
Босс говорит мне сделать это, и вместо того, чтобы ждать моей работы, босс уходит и выполняет другие задачи. Когда я заканчиваю свою работу, я просто сообщаю своему боссу и говорю: «Я СДЕЛАН!» Это асинхронное выполнение.
(Примите мой совет: НИКОГДА не работайте с боссом позади вас.)
Синхронное выполнение означает, что выполнение происходит в одной серии. A->B->C->D
, Если вы вызываете эти подпрограммы, A
запустите, затем завершите, затем B
запустите, затем завершите, затем C
запустите и т. Д.
С асинхронным выполнением вы запускаете подпрограмму и позволяете ей выполняться в фоновом режиме, пока вы начинаете следующее, а затем в какой-то момент произнесите «подождите, пока это не закончится». Это больше похоже на:
Начало A->B->C->D->
Wait для 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
Потому что метод, выполняющий асинхронный вызов, немедленно переходит к следующей строке кода. Я говорю «мог», потому что порядок выполнения не может быть гарантирован асинхронными операциями. Он также может выполняться как оригинал, в зависимости от времени потоков и т. Д.
Я думаю, что это немного круглое объяснение, но все же оно проясняет пример из жизни.
Маленький пример:
Допустим, воспроизведение аудио включает три этапа:
Если ваш аудиоплеер выполняет шаги 1,2,3 последовательно для каждой песни, то это синхронно. Вам придется подождать некоторое время, чтобы услышать песню, пока песня действительно не будет извлечена и распакована.
Если ваш аудиоплеер выполняет шаги 1,2,3 независимо друг от друга, то он асинхронный. то есть. Во время воспроизведения аудио 1 (шаг 3), если он извлекает аудио 3 с жесткого диска параллельно (шаг 1) и распаковывает аудио 2 параллельно. (шаг 2) В итоге вы услышите песню, не дожидаясь извлечения и распаковки.
Синхронизация и асинхронные операции - это порядок выполнения новой задачи по отношению к текущей задаче. Две задачи на столе: текущая задача и новая задача
Синхронный (блокирующий) - подразумевает, что задачи будут выполняться одна за другой. Следующая задача запускается только после завершения предыдущей задачи. Task 2
не начинается, пока Task 1
не закончится
Асинхронный (неблокирующий) - подразумевает, что задача немедленно возвращает управление с обещанием выполнить код и позже уведомить о результате (например, обратный вызов, функция). Task 2
выполняется, даже если Task 1
не завершено
ТАК ответьте про синхронизацию и асинхронность: в iOS , в Android
Проще говоря, асинхронное выполнение делает вещи в фоновом режиме.
Например, если вы хотите загрузить файл из Интернета, вы можете использовать для этого синхронную функцию, но она заблокирует ваш поток, пока файл не завершит загрузку. Это может сделать ваше приложение не реагирующим на любой пользовательский ввод.
Вместо этого вы можете загрузить файл в фоновом режиме, используя асинхронный метод. В этом случае функция загрузки немедленно возвращается и выполнение программы продолжается в обычном режиме. Все операции загрузки выполняются в фоновом режиме, и ваша программа будет уведомлена, когда она будет завершена.
Как на самом деле простой пример,
Синхронная
Представьте, что 3 школьника проинструктированы проводить эстафету на дороге.
1-й студент пробегает свое заданное расстояние, останавливается и передает эстафету 2-му. Больше никто не начал бежать.
1------>
2.
3.
Когда 2-я студентка забирает эстафету, она начинает пробегать заданное расстояние.
1.
2------>
3.
2-я студентка развязала шнурки. Теперь она остановилась и снова связывалась. Из-за этого время окончания второго было увеличено, а время начала третьего было отложено.
1.
--2.--->
3.
Эта модель продолжается до тех пор, пока 3-й не получит эстафету от 2-го и завершит гонку.
АСИНХРОННЫЙ
Представьте себе 10 случайных людей, идущих по одной и той же дороге. Они, конечно, не стоят в очереди, просто случайно ходят по разным местам на дороге в разном темпе.
Шнурок 2-го человека развязался. Она остановилась, чтобы снова связать его.
Но никто не ждет ее, чтобы связать это. Все остальные продолжают идти так же, как и раньше, в том же темпе, что и они.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Я создал gif для объяснения этого, надеюсь, будет полезным: посмотрите, строка 3 асинхронная, а другие синхронные. все строки перед строкой 3 должны ждать, пока строка не закончит свою работу, но из-за того, что строка 3 асинхронна, следующая строка (строка 4) не ждет строки 3, но строка 5 должна ждать, пока строка 4 завершит свою работу, и строка 6 должна ждать строки 5 и 7 для 6, потому что строки 4,5,6,7 не являются асинхронными.
При выполнении последовательности, такой как: a> b> c> d>, если мы получаем ошибку в середине выполнения, такую как:
a
b
c
fail
Затем мы перезапустим с самого начала:
a
b
c
d
это синхронно
Однако, если у нас есть та же последовательность для выполнения: a> b> c> d>, и у нас есть ошибка в середине:
a
b
c
fail
... но вместо перезапуска с самого начала мы перезапускаем с точки сбоя:
c
d
... это известно как асинхронный.
Вы путаете Синхронный с Параллельным против Серии. Синхронный означает все одновременно. Синхронизированный означает относящийся к каждой другой области, который может означать последовательно или с фиксированным интервалом. Пока программа все делает, она работает последовательно. Получить словарь ... вот почему у нас есть несладкий чай. У вас есть чай или подслащенный чай.
Синхронный в основном означает, что вы можете выполнять только одну вещь за раз. Асинхронный означает, что вы можете выполнять несколько вещей одновременно, и вам не нужно завершать выполнение текущей вещи, чтобы перейти к следующей.
Используйте пример инструкции для приготовления завтрака
Если у вас есть опыт приготовления, вы выполняете эти инструкции асинхронно. Вы начнете разогревать сковороду для яиц, а затем начнете бекон. Вы положили хлеб в тостер, а затем начали яйца. На каждом этапе процесса вы запускаете задачу, а затем переключаете свое внимание на задачи, которые готовы к вашему вниманию.
Приготовление завтрака - хороший пример асинхронной работы, которая не параллельна. Один человек (или поток) может справиться со всеми этими задачами. Продолжая аналогию с завтраком, один человек может приготовить завтрак асинхронно, начав следующую задачу до того, как первая завершится. Кулинария прогрессирует независимо от того, наблюдает ли это кто-то или нет. Как только вы начнете разогревать сковороду для яиц, вы можете начать жарить бекон. Как только бекон начинается, вы можете положить хлеб в тостер.
Для параллельного алгоритма вам понадобится несколько поваров (или потоков). Можно было бы сделать яйца, один - бекон и так далее. Каждый из них будет сосредоточен только на одной задаче. Каждый повар (или нить) будет заблокирован синхронно, ожидая, пока бекон будет готов к переворачиванию, или тост, чтобы хлопнуть.
Ссылка из концепции асинхронного программирования
Синхронная операция выполняет свою работу перед возвратом к вызывающей стороне.
Асинхронная операция выполняет (большую часть или всю) свою работу после возврата к вызывающей стороне.
Что касается " в то же время » определения синхронного выполнения (которое иногда сбивает с толку), вот хороший способ понять это:
Синхронное выполнение . Все задачи в блоке кода выполняются одновременно.
Асинхронное выполнение : не все задачи в блоке кода выполняются одновременно.
Я думаю, что хороший способ думать об этом - это классическая беговая эстафета.
Синхронный : процессы, подобные членам одной команды, не будут выполняться до тех пор, пока они не получат эстафету (конец выполнения предыдущего процесса / бегуна), и, тем не менее, все они действуют синхронно друг с другом.
Асинхронный : когда процессы, подобные членам разных команд, на одной и той же трассе эстафеты, они будут запускаться и останавливаться, асинхронно друг с другом, но в пределах одной гонки (общее выполнение программы).
Имеет ли это смысл?
Другое английское определение Synchronize здесь
Координация; комбайн.
Я думаю, что это лучшее определение, чем «происходит одновременно». Это тоже определение, но я не думаю, что оно соответствует тому, как оно используется в информатике.
Таким образом, асинхронная задача не координируется с другими задачами, в то время как синхронная задача координируется с другими задачами, поэтому одна задача заканчивается до запуска другой.
Как это достигается - другой вопрос.
Синхронный означает, что выполнение очереди выполняется по очереди. Предположим, что есть только транспортное средство, которым нужно поделиться между друзьями, чтобы добраться до места назначения по одному транспортному средству.
В асинхронном случае каждый друг может арендовать автомобиль и добраться до места назначения.
Да, синхронный означает в то же время, буквально, это означает делать работу все вместе. несколько человек / объектов в мире могут делать несколько вещей одновременно, но если мы посмотрим на компьютер, он говорит, что синхронные средства означают, что процессы работают вместе, что означает, что процессы зависят от возврата друг друга, и поэтому они выполняются один за другим в правильной последовательности. В то время как асинхронный означает, что процессы не работают вместе, они могут работать одновременно (если они в многопоточности), но работают независимо.