编程语言
首页 > 编程语言> > Javascript / Node中从不执行用户代码的隐藏线程:是否可能,如果可能,它会导致竞争条件的神秘可能性?

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

作者:互联网

根据评论/答案,查看问题的底部以获取更新:这个问题实际上是关于不执行回调的隐藏线程的可能性.

我有一个关于涉及Node Request module的潜在神秘情景的问题,其中:

>通过网络构建并执行完整的HTTP请求(需要很多ms甚至几秒)
> …在本地计算机上运行时执行单个函数之前(通常以纳秒为单位?) – 有关详细信息,请参见下文

我发布这个主要是作为一个完整性检查,以确保我不会误解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不可见,因此不调用任何回调)WAS能够构造请求,并通过网络发送;假设挂起继续,直到收到响应(比如两个块)并等待Node处理. (这种情况肯定是晦涩的,我甚至不确定理论上是否可行.)

然后假设挂起结束,上面的Node线程唤醒.此外,假设(某种程度上)Node能够将响应一直处理到上面代码中执行回调函数的点(但是没有移过原始代码路径中代码中的’hanged’点 – 再次,如果这在理论上是可能的话).

上述神秘的情景在理论上是否可行?如果是这样,在对象上安排’data’事件之前,数据包是否不会通过网络接收并组合,准备好传递给回调函数?在这种情况下,如果可能的话,我会想象“数据”事件会被遗漏.

同样,我理解这是一个神秘的场景 – 考虑到内部机制和编码,可能在理论上甚至不可能.

这是我的问题 – 上面是一个神秘的场景,其极不可能的竞争条件,但理论上可能吗?

我要求确保我没有错过一些关键点.谢谢.

更新:来自评论&回答:我现在澄清了我的问题. “奥术场景”要求有一个HIDDEN线程(因此不能执行任何用户代码,包括CALLBACKS)构建请求,通过网络发送请求并接收响应 – 没有任何回调要触发,包括’data’回调 – 只是在’响应’回调准备被调用的时候停止,等待(单个)可见的JS线程被唤醒.

解决方法:

不,这不可能发生.

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

虽然在创建回调并附加到事件发射器之前确实已经从网络到达数据包,但是在发送请求之前始终会创建侦听最低级别的数据包的回调 – 它是本机“makeRequest”的参数“方法,可以从一开始就调用.因此,当数据包确实在当前脚本之前到达时(仍然被构造事件发射器和附加处理程序占用)已经完成,此事件将排队,并且回调将仅在事件循环准备好后 – 在下一回合执行.到那时,数据事件回调肯定是创建并附加的.

标签:javascript,node-js,callback,race-condition,node-request
来源: https://codeday.me/bug/20190925/1816591.html