【发布时间】:2012-04-18 17:31:29
【问题描述】:
我正在使用 this approach 将数据存储在一个全局数组中,该数组托管一个 http 服务器,其中某些请求将操纵全局数组。
我有点担心某些操作会遇到线程问题——主要是push 和splice。我想如果一个请求让我遍历数组并根据条件删除项目,而另一个请求让我在数组上调用.push(),我会遇到问题。谁能证实这一点?
我主要用 C# 编写,即使是简单的增量也不是线程安全的(启动 25 个执行 i++ 的线程,并不能保证 i == 25 毕竟说完就完事了)。
更新:
我写了 5 个例子来说明我在说什么。测试 1 和测试 3 工作正常。测试 2 失败,因为……通常称为线程问题(无论它们是否是实际的 CPU 线程)。测试 4 和 5 在并行运行时似乎有效(这意味着它们没有像测试 2 那样的碰撞问题)。
我正在使用 ApacheBench 进行测试,发出 1000 个并行请求。
这让我相信测试 1 和测试 3 工作正常,因为 nodejs 不会并行执行超过 1 个 javascript 函数并行(阻塞?)。一旦你实现了 setInterval/setTimeout,它就会释放 nodejs 来执行另一个回调实例(非阻塞?)。app.get('/test3'...) 回调的实例
我真的只是想了解non-blocking I/O model 的真正含义。这是否意味着“嘿,如果您需要非阻塞,可以使用 setTimeout 和 setInterval 进行非阻塞,否则我们将阻止任何其他外层函数运行,直到我们用完我们正在使用的函数” ?我觉得有必要知道这一点,这样我就不会陷入困境,以为我可以实现 /test2 之类的东西并且完全安全。
另外,如果我试图不阻塞我的回调,我真的应该打电话给setTimeout(code, 1)吗?还是有更好的办法?
【问题讨论】:
标签: node.js