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