2016-08-16 2 views
0

Что на самом деле происходит за кулисами с асинхронными функциями?Об асинхронных методах и потоках

Открывает ли он новый поток и позволяет ОС запускать и запускать его?

Если да, может ли это вызвать взаимоблокировки или другие проблемы с резьбой?

Вот пример метода асинхронной:

var fs = require('fs') 
var file = process.argv[2] 

fs.readFile(file, function (err, contents) { 
    var lines = contents.toString().split('\n').length - 1 
    console.log(lines) 
}) 

ответ

1

В fs.readFile(file,callback) .Это не является блокировка вызова, который означает.

  1. элемента дерева основной поток сохраняет callback в ивент-таблицы и ассоциировать его с событием, которое будет излучаемого когда файл процесс чтения делается.
  2. В то же время узел имеет несколько внутренних потоков (пул потоков) от , который основной поток узла назначает задачу чтения файла одному из потока .
  3. После этого присваивания команда возвращается в основной поток, а основной путь продолжается с . Другие задачи и процесс чтения файлов выполняется в фоновом режиме с помощью другого потока (не основного потока).
  4. Всякий раз, когда процесс чтения файла завершается событие, связанное с callback испускается вместе с данными из файла и обратного вызова проталкивается в task-queue где цикл событий пытается нажать каждую задачу в основной поток (стек).
  5. И когда основная резьба (стопка) становится доступной, и нет задачи перед задачей callback, этот обратный вызов переводится в стек основного потока в потоком событий.

Для получения дополнительной информации, пожалуйста, прочитайте event-loop.

Таким образом, поток, который отвечает за чтение файла, не заставляет Deadlock отступать от потоков. Он просто испускает исключение или успех, который позже обрабатывается callback

+0

Итак, нам не нужно беспокоиться о проблемах с потоком при использовании асинхронных функций Node? – shinzou

+0

Да. У вас нет необходимости. Потому что любое исключение будет обработано обратным вызовом. – vkstack

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