Давно-давно лежит у меня в почте письмо, которое всё никак не доходили руки опубликовать.
Здравствуйте, прочитал ваши статьи про параллелизм. Возник вопрос: Асинхронность и параллельность это одно и то же? Если нет, буду благодарен за ссылку на ресурс, где об этом можно подробнее прочитать.
Здравствуйте!
Сразу скажу, что на такой вопрос невозможно ответить объективно, потому что терминология новая, и в разных местах употребляется по-разному. Поэтому могу предложить только своё собственное толкование, не претендуя на универсальность.
Понятия эти разные.
Асинхронность говорит о порядке исполнения кода. Если вызываемая функция не возвращает значение сразу, а отдаёт управление вызывающему коду с обещанием выдать значение позже, то эта функция асинхронная. При этом нет никаких предположений о том, как это значение будет считаться: параллельно или нет.
Параллельность говорит о том, что в машине физически происходит несколько процессов одновременно. При этом, с точки зрения кода программы это всё может выглядеть вполне синхронно. Например, если подряд вызываются две функции, то исполняющая среда может решить по каким-то признакам, что эти функции независимы, и выполнить их параллельно. С точки зрения программы этого заметно не будет.
На практике, конечно, эти понятия пересекаются очень часто, потому что асинхронные вызовы делаются как раз для того, чтобы исполнять функции параллельно с основным кодом. То есть, асинхронные вызовы — самый распространённый способ управления распараллеливанием на уровне кода. Неявную (или автоматическую) параллельность, про которую я написал выше, насколько я знаю, пытаются реализовать сейчас в Хаскелл. Правда, я не в курсе, на какой стадии этот проект.
Комментарии: 12
Иван, вы до сих пор верите в перспективы clojure, даже после таких (http://habrahabr.ru/blogs/nodejs/129640/ -текст о node, но смысл в равной степени подходит и к clojure) постов! То есть я хочу спросить, вы не пересмотрели свои взгляды изложенные в посте "Надо всё переписать"?
Я так и не нашёл времени ближе попользоваться Clojure, ничего определённого про неё сказать не могу. А уж к этому посту ни она, ни node.js точно не относятся…
В описании параллельности лучше не использовать слово "физически" - на машине с одним CPU/Core физически одновременно выполняется только один процесс. Либо "логически", либо опустить это слово вообще.
Согласен. Хотя, пойди найди теперь машину с одним ядром :-).
Помимо машин с одним ядром есть виртуальные машины (или интерпретаторы) вроде Dis в OS Inferno, языка Go с его GOMAXPROCS=1 по умолчанию, того же Python и прочих coroutines - все они дают параллельность, но исключительно логическую, неотличимую от машины с одним ядром.
Вообще-то даже в одном ядре есть распараллеливание внутри.