Потоки данных и параллельное выполнение функций
Всем привет!
Разбираюсь с логикой выполнения функций в nodejs. Дело в том, что у меня есть цикл, который обрабатывает много данных и проводит сложные вычисления. Я так понимаю, что добиться параллельного выполнения функций в одном потоке нельзя. Даже если вызвался callback - он не выполнится, пока в потоке на данный момент происходят вычисления и пока очередь не дойдет до него. Я правильно понимаю?) |
Цитата:
Цитата:
|
Я уже писал тебе про это. В рамках потока всё выполняется последовательно, но ты можешь разбить свой цикл на множество подциклов и выполнять его поэтапно, т.е. прошёл n итераций, прервался, ждёшь пока выполнятся другие задания, потом опять начал и т.д.
Нужные функции в node для этого - это setImmediate и nextTick, НО если у тебя задача требует поддержки потоков в языке, то крайне глупо использовать для этого JS, возьми например Java. |
Цитата:
В случае асинхронного callback он выполнится не сразу как придёт, а сразу как до него дойдёт очередь после того, как он пришёл, т.е. если залочить поток бесконечным циклом, то callback никогда не всплывёт. В общем нужно помнить, что пока JS что-то делает (бегает по циклам, складывает числа), то все уже пришедшие callback-и будут томится в темнице стека-событий ожидая освобождения потока. |
cyber, спасибо за ответ!
kobezzza, Вот нарисовал, как я представляю логику) Вернее как я начал представлять ее)) Получается благодаря nextTick мы прерываем выполнение функции до следующей итерации event-loop? То есть даем возможность дальше выполниться всем остальным функциям? А с новой итерацией уже выполняем то, что задано в nextTick. Все верно? |
Цитата:
Цитата:
Цитата:
|
Цитата:
Разница между nextTick и setImmediate в том, что одни функции выполняются до I/O,а другие после. Тут следует сказать, что выполнение setTimeout и setInterval могут быть как до I/O так и после, т.е. их для этих целей лучше не юзать. *** Прерывания кстати тоже возможны, с помощью генераторов (см. оператор yield, в node они уже поддеживаются). |
Цитата:
|
Цитата:
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, большое спасибо! Теперь все куда более понятно!)
Цитата:
|
Часовой пояс GMT +3, время: 14:07. |