Асинхронный вызов толстых функций
Ситуация следующая.
Конкретизированный ситуация: Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «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, время: 07:03. |