2015-10-30 4 views
-1

Это странный вопрос, но у меня нет какой-либо интуиции о том, как это должно работать, и это трудно повторить:NodeJS createServer HTTPRequest и нити

У меня есть простой веб-сервер в NodeJS, где я глобально обнажая запрос что создано:

http.createServer(function(req, res) { 
    global.request = req; 

    // do something... processRequest(); 
}); 

Внутри «сделать что-то,» это функция, которая использует глобализованную запрос:

function processRequest() { 
    var request = global.request; 
} 

ли это пос ливает столкновение произойдет между любыми двумя экземплярами global.request?

Как я понимаю, каждое соединение использует другой поток, объединенный в пуле C работника, что означало бы столкновение было невозможно (если global контекста не был доступен через упомянутых работников, и такое совместное использование потоков может показаться трудным, если не невозможным), а потому, что JavaScript является средством для обработки соединений, у меня есть подозрение, что такое столкновение может быть возможным.

Любая помощь или указатели на то, как я могу улучшить этот вопрос, очень ценится.

+1

Да, столкновение возможно. Независимо от потоковой передачи, на каждый процесс создается только один глобальный объект, а не на запрос/ответ. Если вы используете кластеры, его работники являются отдельными процессами и будут иметь свой собственный «глобальный» объект. Но каждый процесс все равно может манипулировать несколькими запросами одновременно, тем более, что при обработке запроса задействованы более асинхронные задачи. Ваш JavaScript-код не будет выполняться одновременно («однопотоковый»), но фоновая часть асинхронных задач будет (реализована через C/C++, способная многопоточно). –

ответ

1

Возможно ли возникновение столкновения между любыми двумя экземплярами global.request?

Да, может произойти столкновение, но не существует двух экземпляров global.request. В node.js. существует только одно состояние global.

Как я понимаю, каждое соединение использует другой поток, объединенный в С работником бассейном

Это не правильно. Node.js Javascript является однопоточным, и все запросы запускаются по одному (или иногда чередуются), но только в одном потоке. node.js не использует отдельные потоки для TCP-соединений. Один поток используется для всех сетей. Существует пул потоков C++, который используется для некоторых операций ввода-вывода на диске, но сторона Javascript по-прежнему остается однопоточной. Потоки ввода-вывода просто используются для реализации асинхронного поведения, которое всплывает через Javascript. Эти потоки ввода-вывода не связаны с сетевой реализацией, но могут быть частью вашей путаницы в понимании.

В node.js несколько запросов могут быть «в полете» одновременно. Это означает, что ЛЮБЫЕ данные, к которым могут обращаться запросы, должны знать об этом.

Данные могут использоваться совместно с запросами в глобально доступных переменных, но вы не можете хранить данные, зависящие от запросов, в глобальном, поскольку другие запросы могут привести к его запуску.

Node.js Javascript является однопоточным, что означает, что данный запрос не будет прерываемым прерыванием во время его работы, что упрощает многое, но как только запрос начнет операцию async, а затем завершит текущий поток (ожидание вызова асинхронного вызова), затем могут выполняться другие запросы. Таким образом, вы можете одновременно выполнять несколько запросов в полете.

Обычное решение проблемы, такой как ваш код, показывает, что она НЕ хранит специфичные для запроса вещи в глобальных переменных.Вместо этого вы передаете аргументы запроса/ответа вплоть до любых функций, которые должны их использовать. Вы также можете хранить другие типы данных на самих объектах запроса или ответа.


Таким образом, вместо этого:

http.createServer(function(req, res) { 
    global.request = req; 

    // do something... processRequest(); 
}); 

function processRequest() { 
    var request = global.request; 
} 

Вы должны пройти запрос к какой-либо функции, которая нуждается в этом:

http.createServer(function(req, res) { 

    // do something... 
    processRequest(req); 
}); 

function processRequest(req) { 
    // operate on the request here 
} 
+0

Спасибо за тщательный ответ и исправление, а не анонимно downvoting;) – BTC