Синхронный против Асинхронных языков - PullRequest
7 голосов
/ 18 декабря 2009

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

В каких областях они сильнее по сравнению с другими и в каких областях они падают?

Ответы [ 3 ]

7 голосов
/ 18 декабря 2009

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

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

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

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

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

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

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

  • Если вы не используете язык с первоклассной асинхронной поддержкой, начните использовать любую поддержку promise или future или task, которую обеспечивает язык (например, $.Deferred() в JQuery или $q.defer() от Angular. Они намного чище и обеспечивают лучшую структуру, чем то, что вы обычно получаете с обратными вызовами.

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

3 голосов
/ 18 декабря 2009

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

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

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

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

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

1 голос
/ 18 декабря 2009

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

Счетчик в точке:

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

...