Синхронный по сравнению с Асинхронными языками

Через прошлый 1 год я работал над Java и гибким проводом. При кодировании гибкого провода большинство моих частей кода пошло для броска начиная с его асинхронного. Это сделало меня для размышления о реальных преимуществах и недостатках синхронных языков выполнения по сравнению с асинхронно выполняющимися.

Каковы области, где они более сильны по сравнению с другой и каковы области, они падают?

7
задан Umesh 18 December 2009 в 19:25
поделиться

3 ответа

Я провел большую часть прошлого года, кодируя в Silverlight, а это значит, что я потратил много времени на обдумывание (и борьбу) с теми же проблемами, которые вы описываете.

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

Самым большим недостатком является то, что полученный код сложен и труден для устранения неполадок. Такие вещи, как обработка ошибок, относятся к PITA, но самое неприятное, с чем мне приходилось иметь дело, - это координация ответов от нескольких асинхронных вызовов. Если, скажем, вам нужна информация из вызова A перед вызовом B, и вам нужна информация из вызова B перед вызовом C (и так далее), полученный код выглядит действительно неприятно и подвержен всевозможным странным побочным эффектам. Существуют методы, позволяющие заставить все это работать, и даже достаточно чисто, но если вы пришли из синхронного мира (как и я), это потребует значительного обучения. (И не помогает то, что Microsoft продвигает события как способ обработки вызовов WCF, когда обратные вызовы, на мой взгляд, намного чище и менее подвержены странным побочным эффектам, о которых я говорил.)

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

Обновление 2014.09.23 -

Я проделал намного больше работы с различными асинхронными фреймворками с тех пор, как написал ответ выше (как, вероятно, все остальные, кто занимался веб-кодированием), и подумал, что я добавьте несколько дополнительных случайных примечаний:

  • Если вы используете такой язык, как C # или F #, который имеет первоклассную поддержку асинхронного режима, многое из этого станет намного проще, по крайней мере, если вы осознаете странное шаблоны async / await . Возможность легко обходить асинхронные вызовы и оборачивать все это простым try / catch - это потрясающе, если вам когда-либо приходилось делать это старым способом.

  • используя язык с первоклассной поддержкой async, ожидая возврата вызова БД, этот поток может обслуживать полдюжины других запросов, пока БД работает и делает все, что делает БД. На данный момент для высокомасштабируемых систем async - единственная игра в городе. (Спросите любого поклонника Node.)

7
ответ дан 6 December 2019 в 23:06
поделиться

(Оставляя в стороне обсуждение уровня семантики, например, "язык синхронизации / асинхронности")

"Фреймворк", построенный на "языке" (каким бы он ни был), должен уметь обрабатывать такие случаи (поток программы sync / async) для того, чтобы быть полезным (читай: $ мудрый).

Асинхронные идиомы подходят для любого масштаба.

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

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

3
ответ дан 6 December 2019 в 23:06
поделиться

Я думаю, дело не в языке, а в структуре.

Встречный случай:

При написании приложений «Классический Mac» (MacOS 9 и ранее) на C («синхронный» язык, если он когда-либо был), у вас нет вытесняющей многопоточности, поэтому все потенциально блокирующие системные вызовы имеют асинхронный аналог, где вы заполняете блок данных параметрами, включая функцию обратного вызова. Затем вы выполняете системный вызов (который вернется немедленно), и ваш обратный вызов будет вызываться асинхронно (на так называемом «уровне прерывания»). Нередко обратный вызов выполнял еще один асинхронный системный вызов, создавая длинный фоновый поток, который выполнялся асинхронно с основным.

1
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: