这是一个奇怪的问题,但我对这应该如何运作缺乏直觉,而且很难复制:
我在NodeJS中有一个简单的Web服务器,我在全局公开创建的请求:
svg
在“做某事”中,是一个使用全球化请求的函数:
http.createServer(function(req, res) {
global.request = req;
// do something... processRequest();
});
function processRequest() {
var request = global.request;
}
据我了解,每个连接使用一个不同的线程,汇集在C工作池中,这意味着冲突是不可能的(除非global.request?
上下文可用于所有工作者,并且跨线程的这种共享似乎即使不是不可能也很困难),但由于JavaScript是处理连接的工具,我怀疑这种碰撞是可能的。
我对如何改进这个问题的任何帮助或指示都非常感激。
答案 0 :(得分:1)
是否有可能在任何两个实例之间发生冲突 global.request?
是的,可能会发生冲突,但没有global.request
的两个实例。 node.js中只有一个global
状态。
据我了解,每个连接使用一个不同的线程,汇集在一起 C工作者池
这不正确。 Node.js Javascript是单线程的,所有请求一次运行一个(或者有时是交错的),但只在一个线程上运行。 node.js不使用单个线程进行TCP连接。一个线程用于所有网络。有一个C ++线程池用于某些磁盘I / O操作,但Javascript方面仍然是单线程的。 I / O线程仅用于实现通过Javascript浮出的异步行为。这些I / O线程与网络实现无关,但可能是您理解混乱的一部分。
在node.js中,多个请求可以同时“在飞行中”。这意味着请求可以访问的任何数据都需要知道这一点。
可以在全局可访问变量中的请求之间共享数据,但是您无法在全局中存储特定于请求的数据,因为其他请求可能会使其受损。
Node.js Javascript是单线程的,这意味着给定的请求在运行时不会被先发制人地中断,这简化了很多事情,但是一旦请求启动异步操作然后完成它的当前线程执行(等待调用异步回调),然后其他请求可以运行。因此,您可以同时处理多个请求。
像代码这样的问题的通常解决方案显示它根本不存储全局变量中特定于请求的内容。相反,您将请求/响应参数传递给需要使用它们的任何函数。您也可以在请求或响应对象上存储其他类型的数据。
所以,而不是:
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
}