Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.01.2014, 17:49
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

Потоки данных и параллельное выполнение функций
Всем привет!
Разбираюсь с логикой выполнения функций в nodejs.
Дело в том, что у меня есть цикл, который обрабатывает много данных и проводит сложные вычисления.

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

Я правильно понимаю?)
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2014, 18:02
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Dorian_bs
Даже если вызвался callback - он не выполнится, пока в потоке на данный момент происходят вычисления и пока очередь не дойдет до него.
Если к примеру запрос к базе данных идет, то запрос будет асинхроным и callback выполниться когда прийдет ответ из базы, а если к примеру использовать callback в forEach то эта операция будет синхронной.

Сообщение от Dorian_bs
Дело в том, что у меня есть цикл, который обрабатывает много данных и проводит сложные вычисления.
Просто пример как это можно сделать, сервер А принял запрос на длителььную задачу что бы не блокировать обработку запросов выполнения сложного вычесления передано серверу Б, после выполнения сервере Б, вызывается callback на сервере А и пользователю возврщается результат .
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #3 (permalink)  
Старый 10.01.2014, 18:03
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Я уже писал тебе про это. В рамках потока всё выполняется последовательно, но ты можешь разбить свой цикл на множество подциклов и выполнять его поэтапно, т.е. прошёл n итераций, прервался, ждёшь пока выполнятся другие задания, потом опять начал и т.д.

Нужные функции в node для этого - это setImmediate и nextTick, НО если у тебя задача требует поддержки потоков в языке, то крайне глупо использовать для этого JS, возьми например Java.
__________________
kobezzza
code monkey
Ответить с цитированием
  #4 (permalink)  
Старый 10.01.2014, 18:07
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от cyber Посмотреть сообщение
Если к примеру запрос к базе данных идет, то запрос будет асинхроным и callback выполниться когда прийдет ответ из базы, а если к примеру использовать callback в forEach то эта операция будет синхронной.
Ты написал глупости Всё зависит от интерфейса АПИ, тот же пресловутый forEach легко делается асинхронным с помощью дробления через setImmediate или nextTick (смотри либу async).

В случае асинхронного callback он выполнится не сразу как придёт, а сразу как до него дойдёт очередь после того, как он пришёл, т.е. если залочить поток бесконечным циклом, то callback никогда не всплывёт.

В общем нужно помнить, что пока JS что-то делает (бегает по циклам, складывает числа), то все уже пришедшие callback-и будут томится в темнице стека-событий ожидая освобождения потока.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.01.2014 в 18:12.
Ответить с цитированием
  #5 (permalink)  
Старый 10.01.2014, 18:13
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

cyber, спасибо за ответ!
kobezzza, Вот нарисовал, как я представляю логику) Вернее как я начал представлять ее))

Получается благодаря nextTick мы прерываем выполнение функции до следующей итерации event-loop?
То есть даем возможность дальше выполниться всем остальным функциям?
А с новой итерацией уже выполняем то, что задано в nextTick.
Все верно?

Ответить с цитированием
  #6 (permalink)  
Старый 10.01.2014, 18:14
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от kobezzza
Всё зависит от интерфейса АПИ, тот же пресловутый forEach легко делается асинхронным с помощью дробления
Я как пример говорю, про forEach в том виде в котором он есть.
Сообщение от kobezzza
В случае асинхронного callback он выполнится не сразу как придёт, а сразу как до него дойдёт очередь после того, как он пришёл, т.е. если залочить поток бесконечным циклом, то callback никогда не всплывёт.
Да, согласен тут я не уточнил что он становиться в очередь, и пока до него не дойдет очередь он не будет вызван.
Сообщение от kobezzza
(смотри либу async).
Хорошая либа
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #7 (permalink)  
Старый 10.01.2014, 18:20
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Dorian_bs Посмотреть сообщение
kobezzza, Получается благодаря nextTick мы прерываем выполнение функции до следующей итерации event-loop?
То есть даем возможность дальше выполниться всем остальным функциям?
А с новой итерацией уже выполняем то, что задано в nextTick.
Все верно?
Не, никаких прерываний. Ты просто передаёшь в setImmediate функцию, и она выполнится на следующей итерации событийного цикла, т.е. искуственно разбиваешь свою функцию на множество подфункций. Но в остальном ход мыслей в нужном направлении движется.

Разница между nextTick и setImmediate в том, что одни функции выполняются до I/O,а другие после.

Тут следует сказать, что выполнение setTimeout и setInterval могут быть как до I/O так и после, т.е. их для этих целей лучше не юзать.

***

Прерывания кстати тоже возможны, с помощью генераторов (см. оператор yield, в node они уже поддеживаются).
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.01.2014 в 18:38.
Ответить с цитированием
  #8 (permalink)  
Старый 10.01.2014, 18:28
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

Сообщение от kobezzza Посмотреть сообщение
Разница между nextTick и setImmediate в том, что одни функции выполняются до I/O,а другие после.
kobezzza, То есть функции обернутые в setImmediate будут выполняться в конце следующей итерации?)
Ответить с цитированием
  #9 (permalink)  
Старый 10.01.2014, 18:33
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Dorian_bs Посмотреть сообщение
kobezzza, То есть функции обернутые в setImmediate будут выполняться в конце следующей итерации?)
Ну грубо говоря да. А nextTick в конце текущей, поэтому setImmediate обычно юзают для "разгрузки" больших операций.

process.nextTick(function () {
    console.log(1);

    process.nextTick(function () {
        console.log(2);
    });
});

setImmediate(function () {
    console.log(3);

    process.nextTick(function () {
        console.log(1);

        process.nextTick(function () {
            console.log(2);
        });
    });
});

console.log(4);


// 4 1 2 3 1 2
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.01.2014 в 18:50.
Ответить с цитированием
  #10 (permalink)  
Старый 10.01.2014, 18:51
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

kobezzza, большое спасибо! Теперь все куда более понятно!)

Сообщение от cyber Посмотреть сообщение
Просто пример как это можно сделать, сервер А принял запрос на длителььную задачу что бы не блокировать обработку запросов выполнения сложного вычесления передано серверу Б, после выполнения сервере Б, вызывается callback на сервере А и пользователю возврщается результат .
А вы не можете подсказать, существуют ли какие либо модули для обмена данными между работающими серверами?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jquery, Последовательное выполнение функций разных div в одном скрипте. schnitzer Общие вопросы Javascript 3 29.09.2013 02:49
Не понимаю JavaScript. Как сделать ожидание события загрузки данных? xintrea AJAX и COMET 7 01.06.2013 17:18
Выполнение асинхронных функций PavelX AJAX и COMET 6 04.03.2013 15:14
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Паралельное выполнение 2х функций BorodinKO Общие вопросы Javascript 4 24.01.2012 14:15