Стиль передачи продолжения и параллелизм

Я обнаружил, что во многих блогах параллельное / неблокирующее / асинхронное программирование упоминается как преимущество стиля продолжения передачи (CPS). Я не могу понять, почему CPS обеспечивает параллелизм, например, люди упоминают, что Node.js реализован с использованием CPS, хотя JavaScript является синхронным языком. Кто-нибудь прокомментирует мои мысли?

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

Мое замешательство в основном связано с популярной статьей в блоге Асинхронное программирование и стиль передачи продолжения в JavaScript. В начале статьи доктор Аксель Раушмайер приводит два фрагмента кода, синхронную программу и асинхронную программу на CPS (вставлены сюда для удобства чтения).

Синхронный код:

function loadAvatarImage(id) {
    var profile = loadProfile(id);
    return loadImage(profile.avatarUrl);
}

Асинхронный код:

function loadAvatarImage(id, callback) {
    loadProfile(id, function (profile) {
        loadImage(profile.avatarUrl, callback);
    });
}

Я не понимаю, почему CPS асинхронный. После того, как я прочитал другую статью На примере: стиль передачи продолжения в JavaScript, я подумал, что, возможно, в коде есть предположение: функции loadProfile() и loadImage() сами по себе являются асинхронными функциями. Тогда это не CPS делает его асинхронным. В вторая статья автор фактически показывает реализацию fetch(), которая похожа на loadProfile() в блоге ранее. Функция fetch() делает явное предположение о базовой модели параллельного выполнения, вызывая req.onreadystatechange. Это наводит меня на мысль, что, возможно, параллелизм обеспечивается не CPS.

Предположим, что базовые функции асинхронны, тогда я перехожу ко второму вопросу: можем ли мы писать асинхронный код без CPS? Подумайте о реализации функции loadProfile(). Если это асинхронно не из-за CPS, почему мы не можем просто использовать тот же механизм для асинхронной реализации loadAvatarImage()? Предположим, что loadProfile() использует fork() для создания нового потока для отправки запроса и ожидания ответа, пока основной поток выполняется неблокирующим образом, мы можем сделать то же самое для loadAvatarImage().

function loadAvatarImage(id, updateDOM) {
    function act () {
        var profile = loadProfile(id);
        var img = loadImage(profile.avatarUrl);
        updateDOM (img);
    }
    fork (act());
}

Я даю ему функцию обратного вызова updateDOM(). Без updateDOM() было бы несправедливо сравнивать его с версией CPS - версия CPS содержит дополнительную информацию о том, что делать после загрузки изображения, то есть функцию callback, а исходный синхронный loadAvatarImage() - нет.

Интересно, что @DarthFennec указал, что мой новый loadAvatarImage() на самом деле является CPS: fork() - это CPS, act() - это CPS (если мы явно укажем ему updateDOM), а loadAvatarImage() - это CPS. Цепочка делает loadAvatarImage() асинхронным. loadProfile() и loadImage() не обязательно должны быть асинхронными или CPS.

Если рассуждения, приведенные здесь, верны, могу ли я сделать эти два вывода?

  1. Имея набор синхронных API, кто-то, пишущий на CPS, не сможет волшебным образом создать асинхронные функции.
  2. Если базовые асинхронные / параллельные API-интерфейсы предоставляются в стиле CPS, например, версии CPS для loadProfile(), loadImage(), fetch() или fork(), то можно кодировать только в стиле CPS, чтобы гарантировать, что асинхронные API-интерфейсы используются асинхронно, например, return loadImage(profile.avatarUrl) аннулирует параллелизм loadImage().

«Важный момент: это не CPS - loadProfile () и loadImage () не являются функциями CPS». Я не уверен, что вы имеете в виду. loadAvatarImageявляется CPS в вашем примере. Конечно, loadProfile и loadImage не работают одновременно или CPS. Но fork одновременно работает и CPS. И поскольку fork обеспечивает асинхронность через CPS, loadAvatarImage также должен. Если бы здесь loadAvatarImage не был CPS, он не был бы асинхронным.

DarthFennec 21.06.2018 02:02

Отличный улов, @DarthFennec! Я никогда не думал, что fork() - это CPS, а на самом деле loadAvatarImage() - это CPS. Интересно. Позвольте мне немного отредактировать вопрос, чтобы вы могли написать свой ответ формально. Спасибо, что помогли мне понять это немного больше!

Xiaokui Shu 21.06.2018 02:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
958
0

Другие вопросы по теме