LINUX.ORG.RU

История изменений

Исправление arturpub, (текущая версия) :

Относительно обычного синхронного кода, естественно.

Всего? Или относительно синхронного кода здесь ниже и только в этом стеке вызовов?

В современных языках дефолтно код выполняется синхронно, ты не в курсе?

Открой для себя не «код» (детский сад бладж), а логические потоки исполнения.

Например ты решил обновить данные в таблице, отправив запрос серверу, а пока суть да дело пользователь выделил диапазон и тебе надо для каждой ячейки пройти по урл и что-то там забрать для суммирования. Первая задача пусть будет А, вторая Б.

В случае с колбэками у тебя для потока А будет две функции — первая А1 отправляет запрос, а вторая А2 захватывает контекст и будет вызвана по ответу. Для Б будет точка входа Б0, куча продолжений от запросов Б1..БN и суммирование Бs. Если присмотреться, то увидишь, что A = A1A2, а Б = Б0Б?{N}Бs, вполне себе линейные потоки, друг от друга не зависящие никак, при этом Б еще и на порядок свой плевала с высокой колокольни.

В случае с легкими тредами у тебя для потока А будет одна функция, примерно такая (жс-лайк псевдокод):

function A() {
    var t = get_current_light_thread();
    send_request(address, request, function(result) { t(result); });
    var result = yield();
    update_table(result);
}

Или короче:

function send_request_wait(address, request) {
    var t = get_current_light_thread();
    send_request(address, request, function(result) { t(result); });
    return yield();
}

function A() {
    update_table(send_request_wait(address, request));
}

Для потока Б чуть сложнее, но тоже одна (и с явным элементом синхронизации):

function send_request_group(address, request, group) {
    var t = get_current_light_thread();
    if (!defined(group.results)) group.results = [ ];
    group.n += 1;
    send_request(address, request, function(result) {
        group.results.add(result);
        if (0 == (group.n -= 1)) t(group.results);
    });
}

function B() {
    var group = { };
    for (i = 0; i < n; i++)
        send_request_group(address, request, group);
    var results = yield();
    label1.set_text(sum(results));
}

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

Исходная версия arturpub, :

Относительно обычного синхронного кода, естественно.

Всего? Или относительно синхронного кода здесь ниже и только в этом стеке вызовов?

В современных языках дефолтно код выполняется синхронно, ты не в курсе?

Открой для себя не «код» (детский сад бладж), а логические потоки исполнения.

Например ты решил обновить данные в таблице, отправив запрос серверу, а пока суть да дело пользователь выделил диапазон и тебе надо для каждой ячейки пройти по урл и что-то там забрать для суммирования. Первая задача пусть будет А, вторая Б.

В случае с колбэками у тебя для потока А будет две функции — первая А1 отправляет запрос, а вторая А2 захватывает контекст и будет вызвана по ответу. Для Б будет точка входа Б0, куча продолжений от запросов Б1..БN и суммирование Бs. Если присмотреться, то увидишь, что A = A1A2, а Б = Б0Б?{N}Бs, вполне себе линейные потоки, друг от друга не зависящие никак, при этом Б еще и на порядок свой плевала с высокой колокольни.

В случае с легкими тредами у тебя для потока А будет одна функция, примерно такая (жс-лайк псевдокод):

function A() {
    var t = get_current_light_thread();
    send_request(address, request, function(result) { t(result); });
    var result = yield();
    update_table(result);
}

Или короче:

function send_request_wait(address, request) {
    var t = get_current_light_thread();
    send_request(address, request, function(result) { t(result); });
    return yield();
}

function A() {
    update_table(send_request_wait(address, request));
}

Для потока Б чуть сложнее, но тоже одна (и с явным элементом синхронизации):

function send_request_group(address, request, group) {
    var t = get_current_light_thread();
    var results = [ ];
    group.n += 1;
    send_request(address, request, function(result) {
        results.add(result);
        if (0 == (group.n -= 1)) t(results);
    });
}

function B() {
    var group = { };
    for (i = 0; i < n; i++)
        send_request_group(address, request, group);
    var results = yield();
    label1.set_text(sum(results));
}

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