История изменений
Исправление
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 работает только для протокола генераторов, насколько я понимаю из быстрого гугления, а нормальной кооперативности в него похоже так и не завезут. Так что если говорить о подходах в деревянненьком жс, то твое недоумение понятно, но не надо произносить слов «современных языках» и «синхронизация», не имея о них ни малейшего представления.