我对节点还很陌生,正在尝试设置一个快速服务器。服务器将处理各种请求,如果其中任何一个失败,则调用将发送电子邮件的通用失败功能。如果我使用Java之类的方法进行此操作,则可能会使用诸如同步块和布尔值之类的方法,以允许首次进入代码发送邮件。
Node中是否有类似同步块的内容?我相信节点是单线程的,并且有一些辅助线程来处理异步/回调代码。同一行代码完全可以在Node中同时运行吗?
谢谢!
答案 0 :(得分:-1)
同一行Node.js代码可以同时运行吗?同一行代码完全可以在Node中同时运行吗?
不,不是。您的node.js中的Javascript完全是单线程的。从事件队列中提取事件。这将调用与该事件关联的回调。该回调将一直运行直到返回。在第一个事件返回之前,无法处理其他事件。返回时,解释器从事件队列中提取下一个事件,然后调用与其关联的回调。
这并不意味着node.js中没有并发问题。可能存在,但不是由于代码在相同的物理时间运行并导致对共享变量的访问冲突(例如在Java等线程语言中发生)引起的。并发问题可能是由node.js中I / O的异步特性引起的。在异步情况下,您调用一个异步函数,将其传递给回调函数(或期望返回一个Promise)。然后,您的代码继续,并返回到解释器。稍后,将在node.js本机代码内部发生事件,这将向事件队列中添加一些内容。当解释器可以不运行其他Java脚本时,它将处理该事件,然后调用您的回调,这将导致您的更多代码运行。
虽然所有这些都是“过程中”,但其他事件可以自由运行,而Javascript的其他部分可以运行。因此,暴露于并发问题的原因并非来自同时运行两个代码,而是源于您的一个代码正在运行而另一段代码正在等待回调发生。这两段代码都在“处理中”。它们不能同时“运行”,但是两个操作都在等待其他事情发生才能完成。如果这两个操作以相互冲突的方式访问变量,那么您可能会在Javascript中遇到并发问题。因为所有这些都不是抢占式的(就像Java中的线程一样),所以它们都是非常可预测的,并且易于设计。
Node中是否有类似同步块的内容?
不,没有。您的Javascript代码中根本不需要它。如果您想保护某些异步操作在等待完成时对其进行修改,那么可以在代码中使用简单的标志或变量。因为没有抢占,所以一个简单的标志就可以了。
我相信节点是单线程的,并且有一些帮助线程来处理异步/回调代码。
Node.js以单线程方式运行Javascript。在内部,在其自己的本机代码中,它确实使用线程来完成其工作。例如,node.js内部的异步文件系统访问代码将线程用于磁盘I / O。但是这些线程只是内部的,这些线程的结果不是直接调用Javascript,而是在事件队列中插入事件,并且所有Javascript都将通过事件队列进行序列化。从事件队列中提取事件,运行与事件关联的回调。等待该回调返回。从事件队列中提取下一个事件,重复...
服务器将处理各种请求,如果其中任何一个失败,则调用将发送电子邮件的通用失败函数。如果我使用Java之类的方法进行此操作,则可能会使用诸如同步块和布尔值之类的方法,以允许首次进入代码即可发送邮件。
我们真的必须查看您的代码是什么样的,以了解您要解决的确切问题。我猜想您只能在node.js中使用一个简单的布尔值(常规变量),但是我们必须查看您的代码才能真正了解您的工作。