Асинхронное против синхронного выполнения, что это действительно означает? - PullRequest
1047 голосов
/ 14 апреля 2009

В чем разница между асинхронным и синхронным выполнением?

Ответы [ 22 ]

1561 голосов
/ 14 апреля 2009

Когда вы выполняете что-то синхронно, вы ждете, пока оно завершится, прежде чем перейти к другому заданию. Когда вы выполняете что-то асинхронно, вы можете перейти к другой задаче до ее завершения.

При этом в контексте компьютеров это приводит к выполнению процесса или задачи в другом «потоке». Поток - это серия команд (блок кода), которая существует как единица работы. Операционная система может управлять несколькими потоками и назначать потоку часть («кусочек») процессорного времени перед переключением на другой поток, чтобы дать ему возможность выполнить некоторую работу. По своей сути (простите за каламбур) процессор может просто выполнить команду, он не имеет понятия о том, чтобы делать две вещи одновременно. Операционная система имитирует это, выделяя отрезки времени различным потокам.

Теперь, если вы введете в процесс несколько ядер / процессоров, тогда вещи МОГУТ произойти одновременно. Операционная система может выделять время одному потоку на первом процессоре, а затем выделять такой же блок времени другому потоку на другом процессоре. Все это позволяет операционной системе управлять выполнением вашей задачи, в то время как вы можете продолжить работу в своем коде и выполнять другие действия.

Асинхронное программирование - сложная тема из-за семантики того, как вещи связаны друг с другом, когда вы можете выполнять их одновременно. Есть множество статей и книг на эту тему; посмотри!

1030 голосов
/ 14 апреля 2009

Синхронный / Асинхронный НИЧЕГО НЕ СДЕЛАТЬ С МНОГООБРАЗУЮЩИМ.

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

Синхронный (один поток):

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 представлены <, > символами.
  • Срезы ЦП, представленные вертикальными полосами |

Технически, концепция синхронного / асинхронного действительно не имеет ничего общего с потоками . Хотя, как правило, найти асинхронные задачи, выполняющиеся в одном потоке, необычно, возможно (см. Ниже примеры), и обычно обычно находит две или более задач, выполняющихся синхронно в отдельные потоки ... Нет, понятие синхронного / асинхронного связано с исключительно с тем, можно ли инициировать вторую или последующую задачу до завершения другой (первой) задачи, или это должно подождать. Это все. Какой поток (или потоки), или процессы, или процессоры, или действительно, на каком оборудовании выполняются задачи, не имеет значения. Действительно, чтобы подчеркнуть это, я отредактировал графику, чтобы показать это.

АСИНХРОННЫЙ ПРИМЕР. При решении многих инженерных задач, программное обеспечение предназначено для разделения общей проблемы на несколько отдельных задач, а затем выполнять их асинхронно. Хорошими примерами являются обращение матрицы или проблема анализа методом конечных элементов. В вычислениях сортировка списка является примером. Например, процедура быстрой сортировки разбивает список на два списка и сортирует каждый из них, вызывая себя рекурсивно. В обоих приведенных выше примерах две задачи могут (и часто выполняются) выполняться асинхронно. Они не должны быть в отдельных потоках. Даже машина с одним ЦП и только одним потоком выполнения может быть закодирована, чтобы инициировать обработку второй задачи до завершения первой. Единственным критерием является то, что результаты одной задачи не являются необходимыми в качестве входных данных для другой задачи . Пока время начала и окончания задач перекрываются (возможно только в том случае, если выходные данные одного из них необходимы в качестве входных данных для другого), они выполняются асинхронно, независимо от того, сколько потоков используется.

СИНХРОННЫЙ ПРИМЕР. Любой процесс, состоящий из нескольких задач, где задачи должны выполняться последовательно, но одна должна выполняться на другом компьютере (выборка и / или обновление данных, получение котировки акций из финансовой службы и т. Д.). Если он находится на отдельном компьютере, он находится в отдельном потоке, синхронном или асинхронном.

577 голосов
/ 07 ноября 2014

Проще говоря:

SYNCHRONOUS

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

ASYNCHRONOUS

Вы в ресторане со многими другими людьми. Вы заказываете еду. Другие люди также могут заказать еду, им не нужно ждать, пока ваша еда будет приготовлена ​​и подана вам, прежде чем они смогут заказать. На кухне работники ресторана постоянно готовят, подают и принимают заказы. Люди получат еду, как только она будет приготовлена.

287 голосов
/ 08 июня 2015

Простое объяснение по аналогии

Синхронное выполнение

Мой босс занятой человек. Он говорит мне, чтобы написать код. Я говорю ему: хорошо. Я начинаю, и он наблюдает за мной, как стервятник, стоящий позади меня, с моего плеча. Я как «Чувак, WTF: почему бы тебе не пойти и не сделать что-нибудь, пока я закончу?»

он как: "Нет, я жду прямо здесь , пока ты не закончишь." Это синхронно.

Асинхронное выполнение

Босс говорит мне сделать это, и вместо того, чтобы ждать моей работы, босс уходит и выполняет другие задачи. Когда я заканчиваю свою работу, я просто сообщаю своему боссу и говорю: «Я СДЕЛАН!» Это асинхронное выполнение.

(Примите мой совет: НИКОГДА не работайте с боссом позади вас.)

86 голосов
/ 14 апреля 2009

Синхронное выполнение означает, что выполнение происходит в одной серии. A->B->C->D. Если вы вызываете эти подпрограммы, A запустится, затем завершится, затем начнется B, затем закончится, затем запустится C и т. Д.

При асинхронном выполнении вы запускаете подпрограмму и запускаете ее в фоновом режиме, а затем запускаете следующую, а затем в какой-то момент говорите «дождитесь завершения». Это больше похоже на:

Начало A->B->C->D-> Ожидание для A до конца

Преимущество состоит в том, что вы можете выполнять B, C и или D, пока A все еще работает (в фоновом режиме, в отдельном потоке), так что вы можете лучше использовать свои ресурсы и меньше "зависает" или "ждет".

53 голосов
/ 14 апреля 2009

Синхронный означает, что вызывающая сторона ожидает ответа или завершения, асинхронная, что вызывающая сторона продолжается, и ответ приходит позже (если применимо).

Как пример:

    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

Потому что метод, выполняющий асинхронный вызов, сразу же переходит к следующей строке кода. Я говорю «мог», потому что порядок выполнения не может быть гарантирован асинхронными операциями. Может также выполняться как оригинал, в зависимости от времени потоков и т. Д.

50 голосов
/ 17 августа 2015

Короче говоря, синхронизация относится к двум или более процессам: начало и конец точек, НЕ их выполнения . В этом примере конечная точка процесса A синхронизируется с начальной точкой процесса B:

SYNCHRONOUS
   |--------A--------|
                     |--------B--------|

Асинхронные процессы, с другой стороны, не не синхронизируют свои стартовые и конечные точки:

ASYNCHRONOUS
   |--------A--------|
         |--------B--------|

Если процесс A перекрывает процесс B, они выполняются одновременно или синхронно (определение словаря), поэтому возникает путаница.

ОБНОВЛЕНИЕ: Чарльз Бретана улучшил свой ответ , так что этот ответ теперь является простой (потенциально упрощенно) мнемоникой.

33 голосов
/ 14 апреля 2009

Я думаю, что это немного округлое объяснение, но все же оно проясняется на примере из реальной жизни.

Маленький пример:

Допустим, воспроизведение аудио включает три этапа:

  1. Получение сжатой песни с жесткого диска
  2. Распакуйте аудио.
  3. Воспроизведение несжатого звука.

Если ваш аудиопроигрыватель выполняет шаги 1,2,3 последовательно для каждой песни, то это синхронно. Вам придется подождать некоторое время, чтобы услышать песню, пока песня действительно не будет извлечена и распакована.

Если ваш аудиоплеер выполняет шаги 1,2,3 независимо друг от друга, то он асинхронный. то есть. Во время воспроизведения аудио 1 (шаг 3), если он извлекает аудио 3 с жесткого диска параллельно (шаг 1) и распаковывает аудио 2 параллельно. (шаг 2 ) Вы услышите песню, не дожидаясь извлечения и распаковки.

22 голосов
/ 14 апреля 2009

Проще говоря, асинхронное выполнение делает вещи в фоновом режиме.

Например, если вы хотите загрузить файл из Интернета, вы можете использовать для этого синхронную функцию, но она заблокирует ваш поток до завершения загрузки файла. Это может сделать ваше приложение не реагирующим на любой пользовательский ввод.

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

20 голосов
/ 20 марта 2018

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

Однопоточная - Если у нас есть пара задач, над которыми нужно поработать, и текущая система предоставляет только один поток, тогда задачи назначаются потоку одна за другой. Это может быть наглядно изображено как
Synchronous Single Threaded

Многопоточный - В этой среде у нас было несколько потоков, которые могут выполнять эти задачи и начинать над ними работать. Это означает, что у нас есть пул потоков (новые потоки также могут быть созданы на основе требований и доступных ресурсов) и куча задач. Таким образом, эти темы могут работать над этим как
Synchronous Multi-Threaded

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

однопоточные Asynchronous Single Threade

многопоточных Asynchronous Multi-Threaded

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...