gpt4 book ai didi

javascript - Javascript/Node 中从不执行用户代码 : is it possible, 的隐藏线程,如果是这样,是否会导致竞争条件的神秘可能性?

转载 作者:搜寻专家 更新时间:2023-11-01 00:23:50 29 4
gpt4 key购买 nike

请参阅问题底部的更新,基于评论/答案:这个问题实际上是关于不执行回调的隐藏线程的可能性。


我对涉及 Node Request module 的潜在神秘场景有疑问其中:

  • 一个完整的 HTTP 请求在网络上构建并执行(无论多少毫秒甚至几秒)

  • ...单个函数在运行时在本地机器上执行(通常以纳秒为单位?)- 详情请见下文

我发布这主要是作为健全性检查,以确保我没有误解有关 Node/JS/Request 模块代码的某些内容。

来自examples in the Request module (请参阅该部分中的第二个示例),是这样的:

// Copied-and-pasted from the second example in the 
// Node Request library documentation, here:
// https://www.npmjs.com/package/request#examples

// ... My ARCANE SCENARIO is injected in the middle

var request = require('request')
request(
{ method: 'GET'
, uri: 'http://www.google.com'
, gzip: true
}
, function (error, response, body) {
// body is the decompressed response body
console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
console.log('the decoded data is: ' + body)
}
)

// **************************************************** //
// Is the following scenario possible?
//
// <-- HANG HANG HANG HANG HANG HANG HANG HANG HANG -->
//
// Let us pretend that the current thread HANGS here,
// but that the request had time to be sent,
// and the response is pending being received by the thread
//
// <-- HANG HANG HANG HANG HANG HANG HANG HANG HANG -->
// **************************************************** //

.on('data', function(data) {
// decompressed data as it is received
console.log('decoded chunk: ' + data)
})
.on('response', function(response) {
// unmodified http.IncomingMessage object
response.on('data', function(data) {
// compressed data as it is received
console.log('received ' + data.length + ' bytes of compressed data')
})
})

我在代码片段中指出了我的神秘场景。

假设 Node 进程在指示的点处挂起,但 Node 内部(在一个隐藏线程中,对 Javascript 不可见,因此不调用任何回调)能够构建请求,并通过网络发送;假设挂起一直持续到接收到响应(例如,分为两个 block )并等待 Node.js 处理。 (这种情况肯定是神秘的,我什至不确定理论上是否可能。)

然后假设挂起结束,上面的Node线程被唤醒。此外,假设(以某种方式)Node 能够处理响应一直到执行上面代码中的回调函数的点(但没有移动到原始代码路径中代码中的“挂起”点 - 再次,如果这在理论上是可能的)。

上述神秘场景在理论上是否可能?如果是这样,在为对象安排 'data' 事件之前,数据包是否会通过网络接收并合并,准备传递给回调函数?在这种情况下,如果可能的话,我想 'data' 事件会被错过。

再一次,我明白这是一个神秘的场景 - 考虑到所涉及的内部机制和编码,也许它甚至在理论上是不可能的。

这就是我的问题 - 上述神秘场景及其极不可能的竞争条件在理论上是否可行?

我这样问只是为了确保我没有遗漏一些关键点。谢谢。


更新:根据评论和回答:我现在已经澄清了我的问题。 “神秘场景”需要有一个隐藏线程(因此不能执行任何用户代码,包括回调)构造请求,通过网络发送它,并接收响应 - 没有任何回调触发,包括'data' 回调 - 并在 'response' 回调准备好调用时停止,等待(单个)可见 JS 线程唤醒.

最佳答案

不,这不可能发生。

是的,确实有“隐藏的”后台线程为异步方法工作,但那些不调用回调。 javascript 的所有执行都发生在同一个线程上,同步,顺序。 data 事件回调将始终异步执行,也就是说,在当前脚本/函数运行完成之后。

虽然在创建回调并将其附加到事件发射器之前确实已经有来自网络的数据包到达,但在最低级别监听数据包的回调总是在发送请求之前创建 - 它是 native “makeRequest”方法,可以从一开始就调用。因此,当数据包在当前脚本(仍然被构建事件发射器和附加处理程序占用)完成之前到达时,这个事件被排队,回调只会在事件循环结束后执行准备好-在下一个回合。到那时,data 事件回调当然已经创建并附加了。

关于javascript - Javascript/Node 中从不执行用户代码 : is it possible, 的隐藏线程,如果是这样,是否会导致竞争条件的神秘可能性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906228/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com