Асинхронный вызов толстых функций
Ситуация следующая.
Конкретизированный ситуация: Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «config», который определяет как именно функция будет выполняться. Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют. Более общая форма: Есть: function func(param){...} Хочу: func(obj_1); func(obj_2); ... func(obj_20) И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д. Буду благодарен за напутствующее слово) |
Цитата:
|
dmitriymar, я зелен на этом поле, поэтому, видимо, сча начну ужасные вещи уточнять.
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше. Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо :) |
Цитата:
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 |
Цитата:
http://javascript.ru/tutorial/events...noe-vypolnenie http://javascript.ru/tutorial/events/timing |
dmitriymar, в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
Так же фактически ивенты и выполняются, насколько я себе представляю. |
Цитата:
|
Цитата:
Было бы интересно, если бы автор топика провел нехитрые тесты с замером времени выполнения в его случае и с распараллеливанием через 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);
}
|
|
Цитата:
|
Цитата:
Цитата:
Но должен признать, что не совсем понимаю, как тогда в приведенном выше мною примере, два процесса выполняются одновременно. Это ведь так? |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 02:21. |