node.js - Node 中的哪些操作是线程安全的?

标签 node.js

我正在使用 this approach将数据存储在托管 http 服务器的全局数组中,其中某些请求将操纵全局数组。

我有点担心某些操作会遇到线程问题——主要是 pushsplice。我想如果一个请求让我遍历数组并根据条件删除项目,而另一个请求让我在数组上调用 .push() 我会遇到问题。谁能证实这一点?

我主要用 C# 编写,即使是简单的增量也不是线程安全的(启动 25 个执行 i++ 的线程,并不能保证 i == 25 毕竟说完了)。

更新:

我写了 5 个例子来说明我在说什么。测试 1 和测试 3 工作正常。测试 2 失败,因为……通常称为线程问题(无论它们是否是实际的 CPU 线程)。测试 4 和 5 在并行运行时似乎有效(这意味着它们没有像测试 2 那样的碰撞问题)。

http://pastebin.com/HcJHTDFY

我正在使用 ApacheBench 进行测试,发出 1000 个并行请求。

这让我相信测试 1 和测试 3 工作正常,因为 nodejs 不会执行超过 1 个 app.get('/test3'...) 的实例并行回调 javascript函数并行(阻塞?)。一旦你实现了 setInterval/setTimeout,它就会释放 nodejs 来执行另一个回调实例(非阻塞?)。

我真的只是想了解 非阻塞 I/O 模型 的真正含义。这是否意味着“嘿,如果您需要非阻塞,可以使用 setTimeout 和 setInterval 进行非阻塞,否则我们将阻止任何其他外层函数运行,直到我们用完我们正在使用的函数” ?我觉得有必要知道这一点,这样我才不会陷入困境,以为我可以实现/test2 之类的东西并且完全安全。

另外,如果我试图不阻塞我的回调,我真的应该调用 setTimeout(code, 1) 吗?还是有更好的办法?

最佳答案

所有都是线程安全的。

没有线程,JavaScript是单线程的,两条javascript语句不可能同时运行。

顺便说一句,你不应该使用全局变量,因为全局变量是邪恶的

编辑:

测试 2 失败,因为您使用的是异步回调,这意味着控制权返回到 Node ,它可以处理更多请求。正如所见,这会产生竞争条件。

在 Node 中,任何非异步 block 。您唯一拥有的异步操作是 setTimeout/setInterval/process.nextTick 和任何异步 IO 操作。

不应手动使计算异步。应该避免做太多的计算。

我写了一篇关于 What it means to be non-blocking 的文章

关于node.js - Node 中的哪些操作是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020761/

相关文章:

javascript - 在 node.js 中转换 JSON

php - node.js 中的基本 smtp 服务器

javascript - 使用 node.js 驱动程序将 Mongo 集合导出到 json

javascript - 跨域问题,不同端口的HTTP请求

node.js - 登录nodejs API后生成token

javascript - 将AMD模块导入Mocha测试

javascript - Mongoose:查找、修改、保存

node.js - 检索 JWT 身份验证的证书/ secret 时出现问题。 ( Node/Express/C#/IdentityServer)

javascript - 寻找创建多人游戏的 Node.js 简单教程 (socket.io)

javascript - Koa-异步函数错误处理内的异步函数