Асинхронное программирование фактически выполняет то же самое время для исполнения, как и синхронное

74
6

Мне всегда интересно: предположим, что в магазине один руководитель обслуживает клиента А. Теперь тот же самый руководитель обращается к клиенту B и служит когда-то, снова к C, а затем снова к A и так далее.

Теперь здесь общее время выполнения - это то же самое право, то есть A + B + C time = A time+ B time + C time индивидуально.

Я не вижу веских оснований для этого аспекта времени. Но почему асинхронность имеет жизненно важное значение? Особенно в программном обеспечении для разработки электронных продуктов? Я проиграл интервью из-за глупого вопроса в асинхронном программировании. :(

Может кто-нибудь объяснить? Я знаю определение книги асинхронного программирования, но практически хочу получить удовлетворение там, где оно может быть применено.

спросил(а) 2013-07-14T20:40:00+04:00 7 лет, 7 месяцев назад
1
Решение
75

В вашем примере синхронное программирование - это когда клиент А делает свой заказ и ждет, когда клерк выполнит заказ, тогда клиент B отдаст свой заказ и ждет завершения и т.д. С более чем одним клерком клиенты все еще ждут завершения.

Асинхронный - это когда клиент А делает свой заказ, и клерк говорит "ОК, это будет сделано, вы можете пойти сейчас", и клиент А сразу уходит, удовлетворенный, и клерк просит кого-то другого выполнить задание, а затем сразу обращается к клиенту B и т.д.,

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

ответил(а) 2013-07-14T20:52:00+04:00 7 лет, 7 месяцев назад
86

Существует ряд терминов, которые необходимо определить при работе с этой темой.

Асинхронный - возможность продолжать работу без блокировки (т.е. Не дожидаясь завершения задачи перед началом другой задачи). Задачи Asynch часто выполняются с использованием многопоточности, но это необязательно для этого.

Многопоточность - Наличие нескольких разных "потоков" выполнения в процессе. Часто в вашей программе происходит много потоков, даже не зная об этом.

Multi-Processing - как многопоточность, но когда ваш код чувствителен к выполнению одновременно на нескольких процессорах или ядрах.

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

Асинхронное программирование - это не ожидание завершения работ, если у вас нет другой работы. Даже тогда вы часто ждёте не завершения работы, а для большей работы.

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

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

Асинхронное программирование обычно выполняется посредством многопоточности/обработки, но необязательно требует его. Например, иногда асинхронность может быть достигнута с использованием механизмов опроса, где программа ожидает ввода пользователей, но она продолжает выполнять некоторую работу, периодически проверяя, ввел ли пользователь что-либо. Это не требует многопоточности (технически, пользовательский ввод в большинстве ОС выполняется на собственном процессе или потоке, поэтому в конечном итоге это можно было бы считать, но с точки зрения приложений это не так), но считается асинхронным.

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

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

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

И, конечно, если у вас только один бегун, неважно, пытаетесь ли вы использовать асинхронный или нет, все равно потребуется в 2 раза больше времени для доставки 2 пакетов (ну, на самом деле, 4 раза, поскольку бегун должен работать назад, ждать, когда пакет будет подписан, и т.д.), хотя asynch может немного улучшить производительность входной очереди (человек, принимающий пакет для доставки, который затем выбрасывает его на конвейер для бегуна, чтобы забрать),

ответил(а) 2013-07-14T22:06:00+04:00 7 лет, 7 месяцев назад
75

Асинхронное программирование обеспечивает два основных преимущества:

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

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

ответил(а) 2013-07-14T20:59:00+04:00 7 лет, 7 месяцев назад
60

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

Если ваш клерк ждет клиента, он тратит много времени, тогда как он может переключиться на другого клиента и начать/продолжить другую транзакцию за эти 5 секунд.

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

ответил(а) 2013-07-14T20:46:00+04:00 7 лет, 7 месяцев назад
61

Что ж. Скажем, что вы загружаете два файла из Интернета. У вас есть емкость загрузки 10 мегабайт/с. Два файла, которые вы загружаете (с отдельных серверов), имеют пропускную способность 1 Мбит/с. Что лучше, для загрузки файла A, затем файла B или обоих файлов A и B в "то же самое время"? Даже если общее время обработки данных для CPU будет одинаковым, вы все равно закончите быстрее.

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

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

ответил(а) 2013-07-14T20:44:00+04:00 7 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема