繁体   English   中英

Node.js中的同步块

[英]Synchronous Blocks in Node.js

我想知道在Node.js应用程序中是否可能有同步块。 我是Node的新手,但是对于我正在寻找的行为,我找不到任何好的答案。

我的实际应用程序会涉及更多一些,但是本质上我想做的是支持GET请求和POST请求。 POST请求将项目添加到存储在服务器上的数组中,然后对该数组进行排序。 GET请求将返回数组。 显然,随着同时发生多个GET和POST,我们需要正确性保证。 这是代码理论上看起来非常简单的示例:

var arr = [];

app.get(/*URL 1*/, function (req, res) {
    res.json(arr);
});

app.post(/*URL 2*/, function (req, res) {
    var itemToAdd = req.body.item;
    arr.push(itemToAdd);
    arr.sort();
    res.status(200);
});

it's being sorted. 我担心的是一个GET请求返回数组它或排序之前,但该项目被追加后,更糟的是,返回数组它是进行排序。 在像Java这样的语言中,我可能只会使用ReadWriteLock。 根据我对Node异步性的了解,似乎不会以保留此行为的方式访问arr ,但我希望证明这一点是错误的。

如果无法修改当前必须支持此行为的代码,是否还有其他替代方法或解决方法来使应用程序执行我想要的操作?

我担心的是GET请求在排序之前但在追加项目之后返回数组,甚至更糟的是,在排序时返回数组。

对于这里的代码,您不必担心(尽管请继续阅读,因为您可能要担心其他事情!)。 Node.js是单线程的,因此在将控制权返回给事件循环之前,每个函数都将完整运行。 由于您所有的数组操作都是同步的,因此您的应用将等待数组操作完成后再回答GET请求。

当然,需要注意的一件事是(例如) .sort()花费很长时间。 如果是这样,服务器将在此过程中阻塞。 这就是为什么人们倾向于使用异步操作的原因。 但是,如果保证您的阵列很小,并且/或者这是一个用户数量有限的应用程序(例如,这是一家小公司的Intranet应用程序),那么您所做的可能就可以了。

为了更好地理解整个单线程+事件循环,我建议Philip Roberts关于事件循环的演讲

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM