2012-05-01 1 views
0

Проследовали за этим сказочным tutorial. Будучи новичком в Javascript и функциональном программировании, я хотел понять, что означает неблокирование. Я намеренно добавил «сон» в 10 секунд в моем JS-коде, чтобы добиться блокировки.Новый запрос на Node.js неблокирующее поведение

function route(pathname, handle) 
{ 
    console.log("About to route a request for :"+pathname); 

    if(typeof handle[pathname]==='function') 
    { 
     handle[pathname](); 
    } 
    else 
    { 
     console.log("No request handler for "+pathname); 
    } 


    sleep(10000); 
    console.log("Exiting router"); 
} 

function sleep(milliSeconds) 
{ 
    var startTime = new Date().getTime(); // get the current time 
    while (new Date().getTime() < startTime + milliSeconds); // hog cpu 
} 

exports.route=route; 

Этот код используется как обратный вызов из другого сценария «сервер», который я вызываю из браузера. Я ожидал, что как только я отправлю одновременно 100 запросов на мой серверный скрипт, я получаю параллельные 100 ответов через 10 секунд. Но этот код проходит через запрос один за другим. Это, безусловно, не соответствует философии, стоящей за node.js правильно? Это даже не происходит, когда я делаю такой плохой код в сервлете Java и запускаю Tomcat!

Другое наблюдение в этом случае заключалось в том, что запросы не обрабатывались в хронологическом порядке - они выполняются случайным образом. Это звучит не очень хорошо!

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

Спасибо!

+1

http://stackoverflow.com/questions/5670190/how-do-i-write-non-blocking-code-in-node-js –

ответ

4

Я ожидал, что как только я отправлю одновременно 100 запросов на мой серверный скрипт, через 10 секунд я получу параллельные 100 ответов. Но этот код проходит через запрос один за другим.

Да. Узел строго однопоточный, поэтому каждый запрос будет запускаться в последовательном порядке. В коде JavaScript нет параллелизма (хотя базовая подсистема ввода-вывода компьютера может делать что-то параллельно).

Это, безусловно, не соответствует философии, стоящей за node.js right ??

№. Философия node.js заключается в том, чтобы как можно быстрее выполнить обработчики событий, как только события ввода-вывода будут готовы к действию.

Обратите внимание, что функция «сна» на самом деле не спит, вместо этого она привязывает процессор - поскольку узел является однопоточным, все остальные действия будут блокироваться в коде хруста процессора, то же самое произойдет, если ваш код будет делать некоторые фактические активные операции ЦП. Однако, если ваш код вместо этого выполнял операции ввода-вывода (и был спроектирован должным образом), тогда узел будет планировать другие действия вокруг вашего кода блокировки ввода-вывода. Подумайте об этом так: node.js предотвращает блокировку кода на вводе-выводе, а не блокировку использования ЦП. Если ваш код интенсивно работает в ЦП, и вы беспокоитесь о его блокировании других обработчиков, тогда вы должны его сконструировать таким образом, чтобы уступить циклу событий, позволяющему запускать другие обработчики.

Еще одно замечание в этом случае заключалось в том, что запросы не обрабатывались в хронологическом порядке - они выполняются случайным образом.

Да, это возможно. Вы должны помнить, что node.js - это просто способ привязать «обработчики событий» к интересующим события ввода-вывода. Эти события ввода-вывода инициируются действиями в базовой операционной системе (например, установлено соединение сокета, завершено чтение файла и т. Д.), А node.js вызывает ваши обработчики в ответ.

Поскольку операционная система делает свою собственную «внутреннюю бухгалтерскую отчетность» о том, когда действительно происходит ситуация, и когда она думает, что они доступны для процессов «пользовательского пространства», может быть разница между тем, когда вы ожидаете, что это произойдет, и когда компьютер говорит, что они действительно происходят. Более того, я не думаю, что узел (или, возможно, даже ОС) гарантирует «справедливость» при планировании событий.

+0

Означает ли это, что я не должен использовать Node.js для интенсивного использования ЦП программы? – WinOrWin

+0

Не обязательно, это просто означает, что вы должны знать о последствиях процедур интенсивной работы с ЦП и иметь план «выгрузить» их из цикла событий узла (или разбить его на более мелкие части), если вы подозреваете, что они будут мешать I/вывода. – maerics

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