locking一个对象?

我对Node.js非常陌生,我确信有一个简单的答案,我只是找不到:(

我正在使用文件系统来保存“包”(状态扩展名为“mypackage.idle”的文件夹)。用户可以对这些文件执行操作,导致状态转为“qa”或“部署”等。 。如果服务器正在接受大量请求,并且多个请求进入同一个包,我将如何检查状态,然后执行一个动作,这将改变状态,保证另一个请求在动作之前/期间不会改变发生?

所以在C#这样的东西

lock (someLock) { checkStatus(); performAction(); } 

谢谢 :)

如果checkStatus()和performAction()是一个接一个地被调用的同步函数,那么就像前面提到的那样:它们的执行将不间断地运行直到完成。 但是,我怀疑这两个function在现实中是不同步的,构成它们的现实情况是这样的:

 function checkStatus(callback){ doSomeIOStuff(function(something){ callback(something == ok); }); } checkStatus(function(status){ if(status == true){ performAction(); } }); 

上面的代码是受竞争条件的影响,因为当doSomeIOStuff正在执行,而不是等待新的请求可以送达。

你可能想检查https://www.npmjs.com/package/rwlock库。

这有点误导。 有许多脚本语言假设是单线程的,但是当从同一个源共享数据时会产生一个问题。 当你运行一个单一的请求时,NodeJs可能是单线程的,但是当你有多个请求试图访问相同的数据时,它的行为就像创build一个multithreading语言一样。

这里已经有一个答案: locking一个对象?

 WATCH sentinel_key GET value_of_interest if (value_of_interest = FULL) MULTI SET sentinel_key = foo EXEC if (EXEC returned 1, ie succeeded) do_something(); else do_nothing(); else UNWATCH 

你可以做的一件事是locking一个外部对象,例如数据库中的一个序列,比如Oracle或者Redis。

http://redis.io/commands

例如,我正在使用node.js(我有4个内核)的集群,我有一个node.js函数,每次运行它,我增加一个variables。 我基本上需要locking该variables,所以没有两个线程使用该variables相同的值。

检查了这一点如何使用Redis创build分布式锁?

和这个https://engineering.gosquared.com/distributed-locks-using-redis

如果你知道你在做什么,我认为你可以运用这个想法。

如果您使用callback进行asynchronous调用,这意味着多个客户端可能会做出相同的请求或相关的请求,并以不同的顺序接收响应。 这绝对是locking有用的情况。 您不会以传统意义上“locking线程”,而只是确保asynchronous调用,而且它们的callback是以可预测的顺序进行的。 asynchronous锁包看起来像处理这种情况。

https://www.npmjs.com/package/async-lock

警告,node.js更改语义,如果您添加日志条目,因为日志是IO绑定。

如果你改变了

 qa_action_performed = false function handle_request() { if (check_status() == STATUS_QA && !qa_action_performed) { qa_action_performed = true perform_action() } } 

 qa_action_performed = false function handle_request() { if (check_status() == STATUS_QA && !qa_action_performed) { console.log("my log stuff"); qa_action_performed = true perform_action() } } 

多个线程可以执行perform_action()。

您不必担心与Node.js的同步,因为它是单线程的事件循环。 这是Node.js使用的体系结构的优势之一。

checkStatus()performAction()之间不会执行任何操作。

node.js中没有锁 – 因为你不需要它们。 只有一个线程(事件循环),除非执行I / O之类的asynchronous操作,否则不会中断代码。 因此你的代码不应该被阻塞。 您不能执行任何并行代码。

也就是说,你的代码可能看起来像这样:

 qa_action_performed = false function handle_request() { if (check_status() == STATUS_QA && !qa_action_performed) { qa_action_performed = true perform_action() } } 

在check_status()和perform_action()之间,没有其他线程可以中断,因为没有I / O。 只要您inputif子句并设置qa_action_performed = true,则不会有其他代码进入if块,因此即使perform_action()花费时间执行I / O,perform_action()也不会执行两次。