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