- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目前我正在开发一个由另一个java应用程序更新的数据库,但需要一个NodeJS应用程序来提供Restful API供网站使用。为了最大限度地提高 NodeJS 应用程序的性能,它被集群化并在多核处理器中运行。
但是,根据我的理解,集群 NodeJS 应用程序在每个 CPU 核心上都有自己的事件循环,如果是这样,这是否意味着对于集群架构师,NodeJS 将不得不像其他多线程架构师一样面对传统的并发问题,例如,写入未写保护的同一对象?或者更糟糕的是,因为它是同时运行的多进程,而不是一个进程中的线程被另一个进程阻塞...
我一直在互联网上搜索,但似乎根本没有人关心这一点。谁能解释一下NodeJS的集群架构?非常感谢
添加:
澄清一下,我使用的是express,它不像在不同端口上运行多个实例,它实际上是在监听同一个端口,但每个CPU上都有一个进程竞争处理请求......
我现在想知道的典型问题是:一个基于给定对象 B 更新对象 A 的请求(未完成),另一个使用给定对象 C 再次更新对象 A 的请求(在第一个请求之前完成)...然后结果将基于对象 B 而不是 C,因为第一个请求实际上在第二个请求之后完成。
这在真正的单线程应用程序中不会出现问题,因为第二个将始终在第一个请求后执行...
最佳答案
您问题的核心是:
NodeJS will have to face traditional concurrency issues like in other multi-threading architect, for example, writing to same object which is not writing protected?
答案是这种情况通常是不可能的,因为 Node.js 进程不共享内存。进程A中的ObjectA,ObjectB和ObjectC与进程B中的ObjectA,ObjectB和ObjectC不同。并且由于每个进程都是单线程,因此不会发生争用。这是您发现 Node.js 没有附带信号量或互斥模块的主要原因。另外,node.js 没有附带任何线程模块
这也解释了为什么“没人关心”。因为他们认为这不可能发生。
node.js 集群的问题之一是缓存。由于进程A中的ObjectA和进程B中的ObjectA是完全不同的对象,因此它们将具有完全不同的数据。传统的解决方案当然不是在应用程序中存储动态状态,而是将它们存储在数据库(或内存缓存)中。如果需要,还可以在代码中实现您自己的缓存/数据同步方案。毕竟,这就是数据库集群的工作原理。
当然,node 作为一个用 C 编写的程序,可以很容易地用 C 进行扩展,并且 npm 上有实现线程、互斥和共享内存的模块。如果您故意选择违背 node.js/javascript 设计理念,那么您有责任确保不会出现任何问题。
<小时/>a request to update Object A base on given Object B(not finish), another request to update Object A again with given Object C (finish before first request)...then the result would base on Object B rather than C, because first request actually finishes after the second one. This will not be problem in real single-threaded application, because second one will always be executed after first request...
首先,让我澄清一下您的一个误解。这对于真正的单线程应用程序
来说不是问题。这是伪代码中的单线程应用程序:
function main () {
timeout = FOREVER
readFd = []
writeFd = []
databaseSock1 = socket(DATABASE_IP,DATABASE_PORT)
send(databaseSock1,UPDATE_OBJECT_B)
databaseSock2 = socket(DATABASE_IP,DATABASE_PORT)
send(databaseSock2,UPDATE_OPJECT_C)
push(readFd,databaseSock1)
push(readFd,databaseSock2)
while(1) {
event = select(readFD,writeFD,timeout)
if (event) {
for (i=0; i<length(readFD); i++) {
if (readable(readFD[i]) {
data = read(readFD[i])
if (data == OBJECT_B_UPDATED) {
update(objectA,objectB)
}
if (data == OBJECT_C_UPDATED) {
update(objectA,objectC)
}
}
}
}
}
}
如您所见,上面的程序中没有线程,只是使用 select
系统调用进行异步 I/O。上面的程序可以很容易地直接翻译成单线程 C 或 Java 等(事实上,类似的东西是 JavaScript 事件循环的核心)。
但是,如果对 UPDATE_OBJECT_C 的响应在对 UPDATE_OBJECT_B 的响应之前到达,则最终状态将是 objectA 根据 objectB 而不是 objectC 的值进行更新。
任何语言中的异步单线程程序都无法避免这种情况,node.js 也不异常(exception)。
但请注意,您最终不会处于损坏状态(尽管您最终会处于意外状态)。多线程程序的情况会更糟,因为如果没有锁/信号量/互斥体,对 update(objectA,objectB) 的调用可能会被对 update(objectA,objectC) 和 objectA 的调用中断将会被损坏。这是您在单线程应用程序中不必担心的问题,在 Node.js 中也不必担心。
如果您需要严格的时间顺序更新,您仍然需要等待第一次更新完成,将第一次更新标记为无效或为第二次更新生成错误。通常,对于网络应用程序(例如 stackoverflow),会返回错误(例如,如果您尝试提交评论,而其他人已经更新了评论)。
关于node.js - NodeJS如何处理多核并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354509/
人们在运行TwistedWeb服务器时使用哪些技术来利用多个处理器/内核?有推荐的方法吗? 我基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8、
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
ZeroMQ 用于接收输入参数.. def server(): rep = context.socket(zmq.REP) rep.bind('tcp://*:{}'.format(P
我有一大组标量值分布在 3D 网格上(每个顶点一个值。) 我的目标是展示: 网格中值大于阈值的所有点。 并将连接的点分组(以简化显示。) 所以我的基本解决方案是: 找到通过阈值测试的点 对于每个没有被
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「 小牛呼噜噜 」 。 大家好,我是呼噜噜,
有没有办法让 J 使用多个核心?我认为 APL/J 的部分好处是语言结构很适合并行解决方案。 查看我的 CPU 使用率(我在 OSX 上),显然只有一个处理器在使用。 我有一个很重的函数 f 作用在一
多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断 最佳答案 这应该被视为 other answer
很长一段时间以来,我一直将 LLVM 视为我目前正在实现的语言的新后端。它似乎具有良好的性能,相当高级的生成 API,足够的低级支持来优化奇特的优化。此外,虽然我自己没有检查过,但苹果似乎已经成功地演
我最近开始研究低级OS编程。我(非常缓慢)目前正在研究两本较旧的书,即XINU和Build Your Own 32 Bit OS,以及上一个问题How to get started in operat
我正在阅读对新英特尔凌动 330 的评论,他们指出任务管理器显示 4 个内核 - 两个物理内核,另外还有两个由超线程模拟。 假设您有一个包含两个线程的程序。还假设这些是在 PC 上执行任何工作的唯一线
我不知道如何在 C++ 中进行线程化,我不仅不想知道,而且有没有一种方法可以将线程强制到不同的核心上?另外,我如何才能知道用户拥有多少个内核? 最佳答案 将线程绑定(bind)到任意 CPU 称为设置
如果需要在多核处理器机器的多个内核上并行执行,Linux 内核是否会同时执行多个上下文切换?有引用吗? 最佳答案 是的,你是对的。在 SMP 系统上,多个上下文切换同时发生。每个核心都可以独立进行上下
与进程相比,线程更不可能从多核处理器中获益,这是真的吗?换句话说,内核会决定在单核而不是多核上执行线程吗? 我说的是属于同一进程的线程。 最佳答案 我不知道(各种)Linux 调度程序如何处理这个问题
我需要一些帮助来决定在单个 Solr 实例中创建单个索引还是在单个 Solr 实例中创建多个核心,每个核心为一个索引提供服务。 我的理解是,solr 中的单个索引通常用于索引一种类型的文档。当您有不同
NGINX 或 Apache 是否受益于具有以下任一项的服务器: 多核,或者 多个处理器? 如果是,为什么? 最佳答案 使用多个 CPU/CPU 内核使服务器应用程序有机会并行处理多个客户端连接(和请
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID? NUMA 也是如此。
我有一些关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但当一个人为多核处理器/多处理器系统编写软件时,它会产生很多影响,因此在此询问!) 在多处理器系统或多
所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有
我经常听说其他语言被提升为更适合多核/并发编程,例如Clojure、Scala、Erlang 等,但我有点困惑为什么我需要担心多核问题,Java/.NET VM 不应该自动处理吗?如果没有,背后的原因
假设 x86 多核 PC 架构... 假设有 2 个内核(能够执行 2 个单独的指令流),并且 CPU 和 RAM 之间的接口(interface)是内存总线。 调度在 2 个不同内核上的 2 条指令
我是一名优秀的程序员,十分优秀!