Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Асинхронный вызов толстых функций (https://javascript.ru/forum/events/19343-asinkhronnyjj-vyzov-tolstykh-funkcijj.html)

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
Хотелось бы выполнять функции параллельно, так как выполнение одной - достаточно тяжелый процесс и их результаты друг на друг абсолютно не влияют.....И чтоб вторая функция начала выполняться не ожидая окончания первой. Ну и т.д.

никак

Rogov Dmitry 02.08.2011 13:04

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

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

Если бы каждый вызов func(obj_i) начал выполнятся как онклик ивент, а юзер бы раз 20 кликнул очень быстро в 20 нужных местах - всё выполнилось так как мне надо :)

dmitriymar 02.08.2011 13:10

Цитата:

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

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

ваый 02.08.2011 13:14

Если я не ошибаюсь, для этого можно использовать 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...noe-vypolnenie
http://javascript.ru/tutorial/events/timing

Rogov Dmitry 02.08.2011 13:22

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

Так же фактически ивенты и выполняются, насколько я себе представляю.

dmitriymar 02.08.2011 13:25

Цитата:

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

см ссылки выше. начатый код выполнится целым -невозможно выполнение по частям.разбить на части и выполнять части(то часть одной ,то часть другой-ну дак это разбитие функции на множество функций)-смысл? поток один ,ускорить не возможно выполнение.Можно только замедлить и загрузить лишними действиями

ваый 02.08.2011 13:28

Цитата:

Сообщение от dmitriymar
нет-он в очередь поставит.

Да ведь в том и дело, что 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 -хорошая статья.тоже можно и с сервером.
только вот не для всего подойдёт.если функция должна давать ответ и ничего более, то да.а если функция работает с графикой на странице или другие подобные вещи?
это должны быть настолько длительные и сложные вычисления чтоб механизм этот был оправдан.а в приложении где разница будет в милисекунды с этим методом и без-смысла нет

ваый 02.08.2011 13:55

Ничего не берусь утверждать про применимость этого метода, потому что сам не использовал. Но то что таким образом возможно параллельно выполнить несколько процессов - точно. Наваял простой пример. Конечно, примитив, но все же процессы идут параллельно. Хотя хотелось бы проверить на реальном случае, как бы это было.
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
!!!

Kolyaj 02.08.2011 13:58

Цитата:

Сообщение от ваый
setTimeout это один из известных методов для распараллеливания выполнения процессов

setTimeout не распараллеливает процессы, он откладывает их выполнение. Выполняются они последовательно, но хз в каком порядке.

ваый 02.08.2011 14:01

Цитата:

Сообщение от dmitriymar (Сообщение 116843)

Да, я читал, и согласен с тем что ты говоришь, ставят в очередь..

Цитата:

Сообщение от Kolyaj
setTimeout не распараллеливает процессы, он откладывает их выполнение. Выполняются они последовательно, но хз в каком порядке.

Ну да, это типа эмуляция параллельности.

Но должен признать, что не совсем понимаю, как тогда в приведенном выше мною примере, два процесса выполняются одновременно. Это ведь так?

dmitriymar 02.08.2011 14:07

Цитата:

Сообщение от ваый
Ну да, это типа эмуляция параллельности.

нет, это не эмуляция .посмотри что тебе Kolyaj, написал и поймёшь почему у тебя результат такой

Kolyaj 02.08.2011 14:11

Цитата:

Сообщение от ваый
не совсем понимаю, как тогда в приведенном выше мною примере, два процесса выполняются одновременно.

Так ты же там ещё setTimeout-ов ставишь.


Часовой пояс GMT +3, время: 07:03.