Просмотр полной версии : Асинхронный вызов толстых функций
Rogov Dmitry
02.08.2011, 12:57
Ситуация следующая.
Конкретизированный ситуация:
Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «config», который определяет как именно функция будет выполняться.
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.
Более общая форма:
Есть:
function func(param){...}
Хочу:
func(obj_1);
func(obj_2);
...
func(obj_20)
И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.
Буду благодарен за напутствующее слово)
dmitriymar
02.08.2011, 13:00
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.....И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.
никак
Rogov Dmitry
02.08.2011, 13:04
dmitriymar, я зелен на этом поле, поэтому, видимо, сча начну ужасные вещи уточнять.
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо :)
dmitriymar
02.08.2011, 13:10
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
0 последовательность. отправка запроса-полная отработка начатого выполнение кода+ожидание ответа -обработка ответа,но когда начатый до этого код отработает
1. как раз работающий код в момент получения ответа выполнится до конца ,а потом только пойдёт обработка события.
2. асинхронность связана не с выполнением, а с постановкой в очередь событий,и отсутствием стопора при ожидании ответа. но опять событие вызывающее запрос-сработает только тогда,когда его очередь в очереди подойдёт .
код выполняется последовательно ,порядок его выполнения определяет очередь. язык однопотоковый
Если я не ошибаюсь, для этого можно использовать setTimeout.
Насколько я понимаю, что-то в таком духе:
var objects = [obj1, obj2, ..., objN, ...];
for (var i=0; i<object.length; i++) {
window.setTimeout(function() {
func(objects[i]);
}, 1);
}Но если функции тяжелые и их много, это может застопорить браузер.
В гугл есть об этом по запросу javascript сalling function asynchronously
dmitriymar
02.08.2011, 13:17
Если я не ошибаюсь, для этого можно использовать setTimeout.
Насколько я понимаю, что-то в таком духе:
нет-он в очередь поставит. и будут последовательно выполняться. задержка в 1 мс при этом ничего не значит. пока один не отработает таймер второй не начнёт работу и т.д
http://javascript.ru/tutorial/events/timing#otlozhennoe-vypolnenie
http://javascript.ru/tutorial/events/timing
Rogov Dmitry
02.08.2011, 13:22
dmitriymar, в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
Так же фактически ивенты и выполняются, насколько я себе представляю.
dmitriymar
02.08.2011, 13:25
в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
см ссылки выше. начатый код выполнится целым -невозможно выполнение по частям.разбить на части и выполнять части(то часть одной ,то часть другой-ну дак это разбитие функции на множество функций)-смысл? поток один ,ускорить не возможно выполнение.Можно только замедлить и загрузить лишними действиями
нет-он в очередь поставит.
Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка. Вот тут, например, упоминается в статье об web workers http://www.html5rocks.com/en/tutorials/workers/basics/ (самый первый раздел The Problem: JavaScript Concurrency)
Было бы интересно, если бы автор топика провел нехитрые тесты с замером времени выполнения в его случае и с распараллеливанием через setTimeout, и привел их результаты тут.
dmitriymar
02.08.2011, 13:29
Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка.
ваый,
http://javascript.ru/tutorial/events/timing
http://www.html5rocks.com/en/tutorials/workers -хорошая статья.тоже можно и с сервером.
только вот не для всего подойдёт.если функция должна давать ответ и ничего более, то да.а если функция работает с графикой на странице или другие подобные вещи?
это должны быть настолько длительные и сложные вычисления чтоб механизм этот был оправдан.а в приложении где разница будет в милисекунды с этим методом и без-смысла нет
Ничего не берусь утверждать про применимость этого метода, потому что сам не использовал. Но то что таким образом возможно параллельно выполнить несколько процессов - точно. Наваял простой пример. Конечно, примитив, но все же процессы идут параллельно. Хотя хотелось бы проверить на реальном случае, как бы это было.
var one = function() {
console.log('One started');
var inter = 0;
var counter = 0;
var logger = function() {
inter = setInterval(function() {
counter++;
console.log('One is working! Counter: ' + counter);
}, 500);
};
logger();
setTimeout(function() {
clearInterval(inter);
console.log('One finished');
}, 4000);
}
var two = function() {
console.log('Two started');
setTimeout(function() {
console.log('Two finished');
}, 3000);
}
var functions = [one, two];
for (var i=0; i<functions.length; i++) {
setTimeout(functions[i], 15);
}
dmitriymar
02.08.2011, 13:57
ваый,
ещё раз
http://javascript.ru/tutorial/events/timing
!!!
setTimeout это один из известных методов для распараллеливания выполнения процессов
setTimeout не распараллеливает процессы, он откладывает их выполнение. Выполняются они последовательно, но хз в каком порядке.
ваый,
ещё раз
http://javascript.ru/tutorial/events/timing
!!!
Да, я читал, и согласен с тем что ты говоришь, ставят в очередь..
setTimeout не распараллеливает процессы, он откладывает их выполнение. Выполняются они последовательно, но хз в каком порядке.
Ну да, это типа эмуляция параллельности.
Но должен признать, что не совсем понимаю, как тогда в приведенном выше мною примере, два процесса выполняются одновременно. Это ведь так?
dmitriymar
02.08.2011, 14:07
Ну да, это типа эмуляция параллельности.
нет, это не эмуляция .посмотри что тебе Kolyaj, написал и поймёшь почему у тебя результат такой
не совсем понимаю, как тогда в приведенном выше мною примере, два процесса выполняются одновременно.
Так ты же там ещё setTimeout-ов ставишь.
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot