Давно-давно лежит у меня в почте письмо, которое всё никак не доходили руки опубликовать.

Здравствуйте, прочитал ваши статьи про параллелизм. Возник вопрос: Асинхронность и параллельность это одно и то же? Если нет, буду благодарен за ссылку на ресурс, где об этом можно подробнее прочитать.

Здравствуйте!

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

Понятия эти разные.

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

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

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

Комментарии: 12

  1. comm

    Иван, вы до сих пор верите в перспективы clojure, даже после таких (http://habrahabr.ru/blogs/nodejs/129640/ -текст о node, но смысл в равной степени подходит и к clojure) постов! То есть я хочу спросить, вы не пересмотрели свои взгляды изложенные в посте "Надо всё переписать"?

  2. Ivan Sagalaev

    Я так и не нашёл времени ближе попользоваться Clojure, ничего определённого про неё сказать не могу. А уж к этому посту ни она, ни node.js точно не относятся…

  3. Powerman

    В описании параллельности лучше не использовать слово "физически" - на машине с одним CPU/Core физически одновременно выполняется только один процесс. Либо "логически", либо опустить это слово вообще.

  4. Ivan Sagalaev

    Согласен. Хотя, пойди найди теперь машину с одним ядром :-).

  5. Powerman

    Помимо машин с одним ядром есть виртуальные машины (или интерпретаторы) вроде Dis в OS Inferno, языка Go с его GOMAXPROCS=1 по умолчанию, того же Python и прочих coroutines - все они дают параллельность, но исключительно логическую, неотличимую от машины с одним ядром.

  6. greli.livejournal.com

    Вообще-то даже в одном ядре есть распараллеливание внутри.

  7. Andrey Vityuk

    Иван, вы до сих пор верите в перспективы clojure, даже после таких (http://habrahabr.ru/blogs/nodejs/129640/ -текст о node, но смысл в равной степени подходит и к clojure) постов! То есть я хочу спросить, вы не пересмотрели свои > взгляды изложенные в посте "Надо всё переписать"?

    comm, автор вами указанной статьи слишком плоско мыслит. Следует четко разделять CPU bound и I/O bound задачи.

    Node.js, в частности, заточен для решения второго типа задач, где не предполагается тяжеловесная логика. Обычно в таких приложениях задачи вычислительного характера выносятся на внешние компоненты.

    Более того многие платформы (Erlang, Grizzly и Netty в мире Java) предоставляют возможность работать с гибридным подходом. В случае гибридного решения никто не мешает выделить, к примеру, 2 потока на работу с 100K ассинхронными соединениями и еще дополнительно 8 потоков для вычислительных задач.

    Поэтому не вижу ничего противоречивого в посте Ивана "Надо всё переписать". А нападки на Clojure вообще выглядят смешно. Clojure работает на JVM, которая предоставляет и ассинхронность и многопоточность (смотреть Grizzly, Netty, ...).

  8. comm

    Основной смысл упомянутой мною статьи "Надо всё переписать" я понимаю как: "Если мы хотим, чтобы компьютеры работали значительно быстрее, нам придётся всё переписать в асинхронном стиле". В статье же Теда, помимо неординарного и весьма эпотажного стиля, есть и вполне справедливые мысли (естественно ИМХО), одна из них: Node.js (в частнсти, а асинхронность в общем) не является "серебрянной пулей". Собственно по этому я и привел ее в пример.

  9. GrAndSE

    Если мы хотим, чтобы компьютеры работали значительно быстрее, нам придётся всё переписать в асинхронном стиле

    По-моему, в оригинальной статье данное выражение было разьяснено на примере парсинга xml. Есть ну просто невероятное число задач, которые могут быть разбиты на несколько независимых частей, выполняющихся паралельно на разных ядрах процессора, причем IO и обращение к разделяемым между частями данным для этого должно быть неблокирующим. Почему неблокирующим/асинхронным? На сколько это возможно, избежать необходимости ожидания очередной порции данных в результате использования ресурса другим процессом, не сломав ничего попыткой одновременно изменить эти данные, при этом стараясь сохранить производительность на должном уровне.

    Node.js (в частнсти, а асинхронность в общем) не является "серебрянной пулей". Собственно по этому я и привел ее в пример.

    Node.js из всего вышеперечисленного дает только неблокирующий IO и обращения к изменяемым данным. Но способа выполнять паралельно вычисления и обработку данных и просто распределять нагрузку между процессорами node.js не дает никакой возможности. Нет там способа сказать: по мере получения данных отсюда будем разбивать их на две-три порции и производить над ними операции и собирать результаты обработки воедино. Для JavaScript вообще я не могу навскидку представить на основании чего это можно было бы синтаксически делать. В Python есть генераторы, в диалектах Lisp бесконечные/конечные потоки, продолжения (как и в Ruby).

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

  10. multlurk

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

  11. Ivan Sagalaev

    По идее, "неблокирующий" — это синоним "асинхронного".

  12. Андрей Иванов

    Ivan Sagalaev, с 2011 ничего нового не появилось по параллельному программированию? Я прослушал лекции на Лекториуме, скажем тут http://www.lektorium.tv/lecture/?id=13886. Не смог ничего найти по ассемблеру параллельному. Ну да, у Интела есть инструмент по ПП, но это С++. Не пускают в ПП ассемблер?

Добавить комментарий