02.08.2011, 12:57
|
Новичок на форуме
|
|
Регистрация: 02.08.2011
Сообщений: 8
|
|
Асинхронный вызов толстых функций
Ситуация следующая.
Конкретизированный ситуация:
Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «config», который определяет как именно функция будет выполняться.
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.
Более общая форма:
Есть:
function func(param){...}
Хочу:
func(obj_1);
func(obj_2);
...
func(obj_20)
И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.
Буду благодарен за напутствующее слово)
|
|
02.08.2011, 13:00
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Rogov Dmitry
|
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.....И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.
|
никак
Последний раз редактировалось dmitriymar, 02.08.2011 в 13:02.
|
|
02.08.2011, 13:04
|
Новичок на форуме
|
|
Регистрация: 02.08.2011
Сообщений: 8
|
|
dmitriymar, я зелен на этом поле, поэтому, видимо, сча начну ужасные вещи уточнять.
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо
|
|
02.08.2011, 13:10
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Rogov Dmitry
|
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
|
0 последовательность. отправка запроса-полная отработка начатого выполнение кода+ожидание ответа -обработка ответа,но когда начатый до этого код отработает
1. как раз работающий код в момент получения ответа выполнится до конца ,а потом только пойдёт обработка события.
2. асинхронность связана не с выполнением, а с постановкой в очередь событий,и отсутствием стопора при ожидании ответа. но опять событие вызывающее запрос-сработает только тогда,когда его очередь в очереди подойдёт .
код выполняется последовательно ,порядок его выполнения определяет очередь. язык однопотоковый
Последний раз редактировалось dmitriymar, 02.08.2011 в 13:14.
|
|
02.08.2011, 13:14
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Если я не ошибаюсь, для этого можно использовать 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
Последний раз редактировалось ваый, 02.08.2011 в 13:16.
|
|
02.08.2011, 13:17
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от ваый
|
Если я не ошибаюсь, для этого можно использовать setTimeout.
Насколько я понимаю, что-то в таком духе:
|
нет-он в очередь поставит. и будут последовательно выполняться. задержка в 1 мс при этом ничего не значит. пока один не отработает таймер второй не начнёт работу и т.д
http://javascript.ru/tutorial/events...noe-vypolnenie
http://javascript.ru/tutorial/events/timing
Последний раз редактировалось dmitriymar, 02.08.2011 в 13:19.
|
|
02.08.2011, 13:22
|
Новичок на форуме
|
|
Регистрация: 02.08.2011
Сообщений: 8
|
|
dmitriymar, в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
Так же фактически ивенты и выполняются, насколько я себе представляю.
|
|
02.08.2011, 13:25
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Rogov Dmitry
|
в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
|
см ссылки выше. начатый код выполнится целым -невозможно выполнение по частям.разбить на части и выполнять части(то часть одной ,то часть другой-ну дак это разбитие функции на множество функций)-смысл? поток один ,ускорить не возможно выполнение.Можно только замедлить и загрузить лишними действиями
|
|
02.08.2011, 13:28
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Сообщение от dmitriymar
|
нет-он в очередь поставит.
|
Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка. Вот тут, например, упоминается в статье об web workers http://www.html5rocks.com/en/tutorials/workers/basics/ (самый первый раздел The Problem: JavaScript Concurrency)
Было бы интересно, если бы автор топика провел нехитрые тесты с замером времени выполнения в его случае и с распараллеливанием через setTimeout, и привел их результаты тут.
|
|
02.08.2011, 13:29
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от ваый
|
Да ведь в том и дело, что setTimeout это один из известных методов для распараллеливания выполнения процессов, способ обойти однопоточность языка.
|
ваый,
http://javascript.ru/tutorial/events/timing
http://www.html5rocks.com/en/tutorials/workers -хорошая статья.тоже можно и с сервером.
только вот не для всего подойдёт.если функция должна давать ответ и ничего более, то да.а если функция работает с графикой на странице или другие подобные вещи?
это должны быть настолько длительные и сложные вычисления чтоб механизм этот был оправдан.а в приложении где разница будет в милисекунды с этим методом и без-смысла нет
Последний раз редактировалось dmitriymar, 02.08.2011 в 13:47.
|
|
|
|