2016-04-25 2 views
0

Я читал, что node.js является однопоточным и синхронным. Однако запросы ввода-вывода выполняются асинхронно [1].node.js - точность о пути выполнения кода

У меня вопрос. С учетом следующего фрагмента кода:

c.query( //#1 
'SELECT SLEEP(20);', //#2 
    function (err, results, fields) { 
     console.log("query executed"); //#3 
    } 
); 
console.log("hello"); //#4 

Предположим, что в очереди есть 2 запроса. Мое понимание таково: Первый запрос делает этот путь # 1 -> # 2 -> # 4 -> # 3. После этого обрабатывается второй запрос.

Из того, что я читал, кажется, автор подразумевает # 1 -> # 2 -> # 4. Поскольку # 3 является асинхронным (ожидание ввода-вывода), второй запрос обрабатывается тем временем.

Может ли кто-нибудь прояснить это? Благодарю.

ответ

0

Node.js поток событий основан на обратных вызовах, которые являются асинхронными.

Таким образом, даже если Node.js является однопоточным, когда вы вызываете функцию, которая выполняет обратный вызов, эта функция вызывается асинхронно, без блокировки выполнения синхронного кода.

В примере, который вы вставили, вы можете видеть, что функция принимает обратный вызов как последний параметр. Как только он вызывается, Node.js отправляет выполнение в поток событий, переходя к следующей строке кода.

Чтобы уточнить, в этом примере нет пути # 2, 'SELECT SLEEP(20);' - это первый параметр функции запроса. Второй параметр - это функция обратного вызова function (err, results, fields) {}, выполняемая, когда функция запроса возвращает результат.

Поток будет # 1 -> # 3 -> # 2:

c.query('SELECT SLEEP(20);',//#1 
    function (err, results, fields) { 
     console.log("query executed"); //#2 
    } 
); 
console.log("hello"); //#3 
+0

С # 1 делает сон базы данных MySQL для 20, # 1 -> # 3 -> # 2 означает, что # 2 выполняется через 20 секунд. Затем # 1 блокирует выполнение, правильно? – Kamil

+0

Не совсем. Мы говорим о потоке выполнения node.js. Если вы сделаете что-то вроде «SELECT SLEEP (20000)», ваш db будет спать в течение 20 секунд, но node.js не будет заблокирован и продолжит выполнение следующих строк кода. Другая логика зависит от приложения, которое вы создаете. –

+0

Итак, если # 3 занимает много времени, то мы можем предположить, что путь может стать # 1 -> # 2 -> # 3? – Kamil