2013-09-21 2 views
1

Рассмотрим this:Узел обратного стрельбы одновременно

может быть только один обратный вызов стрельбы одновременно

Так считают этот код:

var http = require("http"); 
function onRequest(request, response) { 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.write("Hello World"); 
    response.end(); 
} 

http.createServer(onRequest).listen(8888); 

Если мой приложение получает запрос, тогда вызывается OnRequest. Если только один раз можно выполнить один звонок, тогда запросы будут поставлены в очередь. Это правильно?

+0

Что вы пытаетесь выяснить? В любом случае запросы всегда находятся в очереди на уровне операционной системы. – Pointy

+2

Узел не является многопоточной средой. – Pointy

+0

@Pointy Даже у меня были такие же сомнения. Не могли бы вы указать мне некоторые документы? – thefourtheye

ответ

5

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

так что если вы установите setTimeout в onRequest до 10 секунд. и сделать 100 запросов на сервер, все запросы возвратят вам данные через 10 секунд, а не 10,20,30 ...

Поскольку node.js - это однопроцессорное приложение, запрос будет поставлен в очередь, но человек будет иметь очень небольшую долю времени. Вы можете попробовать экспериментальные функции, такие как http://nodejs.org/api/cluster.html для параллельной обработки запроса. Здесь очередность не означает, что если reques1 получить ответ request2 не будет дан ответ, но это означает, что процесс узла будет отвечать на них до тех пор, пока каждый более ранний запрос не получит свои обратные вызовы, которые не влияют на производительность ваших сайтов вообще.

чтение http://book.mixu.net/node/single.html это один из самых удивительных книг также http://www.nodebeginner.org/

EDIT 1 Node.js просить вас написать неблокируемый код. В случае отсутствия кода блокировки мы используем обратные вызовы.

Node.js - однопоточное приложение, но оно ведет себя как один важный важный поток и другой менее важный пул потоков (в нем нет конкретных приоритетов).

Eg: An ambulance waits for phone call to come every time. 
    when it gets a call it goes to pick up the patient and take him to the hospital. 
    while the doctor is performing operation on the patients. Ambulance team does not 
    switch off their phone and wait for its first patient to get healthy but 
    If they get another call they go to pick up the next guy 

    when they were off to receive next guy hospital calls and say first patient is 
    healthy and drop him home, ambulance does not leave other guy in pain but complete 
    its second task and then drop first guy home. 

    so callback was doctorPerformOperation which was put in thread pool 
    and 
    recieveTheGuy was a blocking operation 

Так из вашего кода она очень мала, так что может случиться так, что каждый ответ может быть после его запроса, но это также возможность того, что из 5 (почти) одновременных запросов 3 получает обратный вызов назначено до 2nds соединения Последнего 'извед.

Более конкретные примеры

Блокировка кода

setTimeout(function() { 
    console.log('bye') 
}, 100); 

while(1) { 
} 

'до свидания' никогда не будут напечатаны

Без блокировки Код

setTimeout(function() { 
    console.log('bye') 
}, 100); 

setInterval(function() { 
    console.log('hi'); 
}, 100); 

bye будет напечатано через 1 сек, но может затянуться на какую-нибудь секунду, если hi печатал в том же экземпляре.

Он выполняет обратные вызовы, когда основной процесс является бесплатным.

Больше неблокирующая

setTimeout(function() { 
    console.log('bye') 
}, 100); 

setInterval(function() { 
    console.log('hi'); 
}, 50); 

setInterval(function(){ 
    console.log('hello'); 
},100); 

Угадайте, что будет с этим?

EDIT 2:

Я написал небольшой код

exports.sample = function (res) { 
var tcpsocket = net.createConnection(port, host); 
tcpsocket.on('connect', function() { 
    tcpsocket.write('query'); 
    console.log('tcp'); 
}); 
tcpsocket.on('data', function (data) { 
    res.write(data); 
}); 
tcpsocket.on('end', function() { 
    console.log('end'); 
    res.end(); 
}); 
tcpsocket.on('error', function (e) { 
    var ret={error:'error'} 
    res.end(JSON.stringify(ret)); 
    console.log('Error occured in tcp socket'); 
     console.log(e); 
}); 
tcpsocket.on('close', function() { 
    console.log('socket close'); 
    res.end(); 
}); 
}; 

Теперь сокет я подключения был с сокет, который записывает данные в 10 с интервалом в 10 раз. Поэтому каждый запрос занимает около 100 секунд для завершения. поскольку я не вызывал res.end в событии «данные», браузер не загружает ничего до завершения полного запроса. Если вы хотите видеть данные, поступающие в реальном времени, вы можете использовать завиток для одного и того же URL-адреса.

Результат: При открытии 10 вкладок одновременно вы сможете увидеть данные на всех вкладках в 100sec (не 100s, 200s ...)

+0

см. Это: Событие может быть связано с HTTP-подключением к клиенту или, возможно, из прочитанного файла. Поскольку существует только один процесс, параллельное выполнение Javascript-кода отсутствует. Несмотря на то, что вы можете выполнять несколько операций ввода-вывода с различными обратными вызовами, только один из них будет иметь код Node/Javascript за один раз (остальные будут активированы, когда они будут готовы, и никакой другой JS-код не будет запущен). –

+0

Нет никакого параллельного кода, но его запуск с использованием временного мультиплексирования, что автор сказал правильно, - все же он означает, что никакой запрос не блокируется, если какой-либо вызов не блокирует пример while loop. – Gaurav

+0

Wht is this: nly один из них будет иметь код Node/Javascript, выполняемый одновременно. Так мои запросы поставлены в очередь. –

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