让我们看一下简单的代码片段:
var express = require('express');
var app = express();
var counter = 0;
app.get('/', function (req, res) {
// LOCK
counter++;
// UNLOCK
res.send('hello world')
})
Run Code Online (Sandbox Code Playgroud)
假设这app.get(...)被调用了很多次,并且您可以理解,我不希望该行counter++由两个不同的线程同时执行。
因此,我想锁定此行,以便只有一个线程可以访问此行。我的问题是如何在node.js中做到这一点?
我知道有一个锁包:https://www.npmjs.com/package/locks,但是我想知道是否有没有外部库的“ 本机 ”方式。
我不希望两个不同的线程同时执行行计数器++
在node.js中不会发生这种情况。
node.js是单线程的并且是事件驱动的,因此一次只能运行一个Javascript代码。您不必担心多线程系统的典型先发性并发问题。
就是说,如果您使用异步代码,则在node.js中仍然会存在并发问题,因为node.js异步模型将控制权返回给系统以处理下一个事件,并且异步回调将在将来的某个事件中调用。但是,并发问题不是先发制人的,因此您可以完全控制何时发生。
如果您在app.get()路由处理程序中向我们展示您的实际代码,那么我们可以更具体地建议您是否存在并发问题。而且,如果您这样做,我们可以就如何最好地解决此问题提供建议。
线程池中的线程都是在后台运行的本机代码。它们仅通过在事件队列中对事件进行排队来触发实际的Javascript运行。因此,由于所有运行的Javascript都是通过事件队列序列化的,因此您一次只能运行一个Javascript。事件队列的基本方案是解释器运行一段Javascript,直到它将控制权返回给系统为止。那时,解释器会在事件队列中查找,如果有事件在等待,它将把该事件拉出并调用与该事件关联的回调。同时,如果在后台运行本机代码,则在完成时会将事件添加到事件队列中。在当前的Javascript将控制权返回给系统之前,该事件不会被处理,然后它可以从事件队列中提取下一个事件。因此,正是这种事件队列使一次只运行一个Javascript的序列化。