2014-11-29 3 views
4

Этот вопрос заключается в том, чтобы понять, как цикл событий вызывает поток пула для обработки задачи. Скажите, Я хочу создать функцию (скажем, обрабатывать небольшую задачу), а не операцию ввода-вывода, я хочу, чтобы это было обработано с помощью функции обратного вызова, так что она может вызывать пул потоков, а задача может совпадать с моим основным потоком , и возвращает результат обратного вызова после завершения. У меня есть понимание, что это можно сделать, создав дочерние процессы (форматирование и т. Д.), , но я немного смущен и хочу понять, как именно процесс выполняется одновременно в однопоточном узле в операции ввода-вывода, а не в пользовательской операции. Что именно происходит в цикле событий, все события будут переданы в пул потоков или как он идентифицирует, является ли это операцией ввода-вывода?Определенная пользователем функция обратного вызова использует пул потоков в node.js?

Я новичок в node.js и полностью смущен. Помощь будет оценена :)

ответ

0

«Node.js управляет свои собственные потоки ввода/вывода» с помощью libuv для операций, связанных с сетью, файловой системы и т.д. libuv по существу создает пул потоков для ввода-вывода, который зависит от размера платформы. Цикл событий V8 представляет собой отдельный поток, который обрабатывает события в очереди. Эти события сопоставляются с функцией JavaScript, выполняемой с данными события. Таким образом, асинхронный ввод-вывод обрабатывается Node.js.

Источник:http://www.wintellect.com/blogs/dbanister/stop-fighting-node.js-in-the-enterprise

Таким образом, каждая операция ввода/вывода выполняется вне V8 нити цикла обработки событий, поэтому он работает одновременно.

Операции ввода-вывода работают эффективно, поскольку, как вы упомянули, используется пул потоков - группа потоков, которые «ждут» входящих задач из цикла событий V8, выполняют их и возвращают данные в функции обратного вызова JavaScript.

+0

, если я создаю функцию 2, скажу A и B, я вызываю функцию отправки B как параметр и функцию A, называемую этой функцией в качестве обратного вызова, будет ли эта функция отображаться в цикле событий ??? Теперь выполнение этой области кода является асинхронным или синхронным? –

+0

@SureshMainali Он синхронный, то есть функции A и B работают в пределах одной и той же последовательности циклов событий. Чтобы запустить B в другой итерации, вы можете использовать что-то вроде 'setTimeout' или [' process.nextTick'] (http://nodejs.org/api/process.html#process_process_nexttick_callback) – Curious

+0

@SureshMainali перефразирует мой комментарий: этот регион код *** может *** быть асинхронным, если вы вызываете B из другой асинхронной функции (например, 'setTimeout',' process.nextTick', 'fs.readFile' и т. д.) – Curious

-1

Как вы уже указали, время автономной работы однопоточного. Узел хорошо подходит для работы с IO. Это меньше рекомендуется для привязки к процессору, поскольку он блокирует цикл событий узла.

+0

Итак, могу ли я понять, что асинхронное свойство узла предназначено только для задачи ввода-вывода, остальное является синхронным ??? в нормальном смысле ... –

+0

@SureshMainali, точно. Вот почему узел является удивительным для Интернета, потому что это в основном IO (handle web req/web resp/db/disk). Но определенно не для интенсивных задач ЦП. – Maxim

+1

Спасибо за быстрый ответ :) Помогли мне много ... –

Смежные вопросы