Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.08.2011, 12:57
Новичок на форуме
Отправить личное сообщение для Rogov Dmitry Посмотреть профиль Найти все сообщения от Rogov Dmitry
 
Регистрация: 02.08.2011
Сообщений: 8

Асинхронный вызов толстых функций
Ситуация следующая.

Конкретизированный ситуация:

Есть массив обьектов. Есть функция в параметрах которой - элемент этого массива. Сам элемент есть некий обьект «config», который определяет как именно функция будет выполняться.

Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.

Более общая форма:

Есть:
function func(param){...}

Хочу:
func(obj_1);
func(obj_2);
...
func(obj_20)

И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.

Буду благодарен за напутствующее слово)
Ответить с цитированием
  #2 (permalink)  
Старый 02.08.2011, 13:00
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Rogov Dmitry
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.....И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.
никак

Последний раз редактировалось dmitriymar, 02.08.2011 в 13:02.
Ответить с цитированием
  #3 (permalink)  
Старый 02.08.2011, 13:04
Новичок на форуме
Отправить личное сообщение для Rogov Dmitry Посмотреть профиль Найти все сообщения от Rogov Dmitry
 
Регистрация: 02.08.2011
Сообщений: 8

dmitriymar, я зелен на этом поле, поэтому, видимо, сча начну ужасные вещи уточнять.

Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.

Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо
Ответить с цитированием
  #4 (permalink)  
Старый 02.08.2011, 13:10
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Rogov Dmitry
Механизм ивентов и хмльхттпРеквест позволяют не ожидать окончания, а идти программе дальше.
0 последовательность. отправка запроса-полная отработка начатого выполнение кода+ожидание ответа -обработка ответа,но когда начатый до этого код отработает
1. как раз работающий код в момент получения ответа выполнится до конца ,а потом только пойдёт обработка события.
2. асинхронность связана не с выполнением, а с постановкой в очередь событий,и отсутствием стопора при ожидании ответа. но опять событие вызывающее запрос-сработает только тогда,когда его очередь в очереди подойдёт .
код выполняется последовательно ,порядок его выполнения определяет очередь. язык однопотоковый

Последний раз редактировалось dmitriymar, 02.08.2011 в 13:14.
Ответить с цитированием
  #5 (permalink)  
Старый 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.
Ответить с цитированием
  #6 (permalink)  
Старый 02.08.2011, 13:17
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 02.08.2011, 13:22
Новичок на форуме
Отправить личное сообщение для Rogov Dmitry Посмотреть профиль Найти все сообщения от Rogov Dmitry
 
Регистрация: 02.08.2011
Сообщений: 8

dmitriymar, в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?

Так же фактически ивенты и выполняются, насколько я себе представляю.
Ответить с цитированием
  #8 (permalink)  
Старый 02.08.2011, 13:25
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Rogov Dmitry
в принципе, меня бы устроило, если бы выполнение функций стало в хитрую очередь и выполнялось бы по частям. Это возможно?
см ссылки выше. начатый код выполнится целым -невозможно выполнение по частям.разбить на части и выполнять части(то часть одной ,то часть другой-ну дак это разбитие функции на множество функций)-смысл? поток один ,ускорить не возможно выполнение.Можно только замедлить и загрузить лишними действиями
Ответить с цитированием
  #9 (permalink)  
Старый 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, и привел их результаты тут.
Ответить с цитированием
  #10 (permalink)  
Старый 02.08.2011, 13:29
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функций iframe из кода Firefox-расширения Jury Firefox/Mozilla 0 03.05.2011 13:09
Несколько функций на одно событие. abstract Events/DOM/Window 13 26.10.2010 10:46
Как отлаживать события? Или как сделать трассировку вызовов функций? gennad Events/DOM/Window 1 18.08.2010 13:21
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20
Явный вызов процедуры обработки события. supchik Общие вопросы Javascript 18 27.01.2009 13:16