Tag: multithreading

Java NIO非阻塞模式vs node.jsasynchronous操作

我还没有经历node.js的代码细节。 但是,经过对Node.js中线程的研究,我发现它有单线程来接受来自多个客户端的连接。 当与客户端连接时,它会触发连接事件并监听另一个客户端,并以asynchronous方式完全工作,客户端请求的hibernate操作从线程池执行,结果通过callback被发送回主线程(接受连接的线程)。 像Java中的NIO也是ServerSocketChannel一样,SocketChannel可以设置为非阻塞模式,并且使用select器单线程可以监控多个通道。 因此,使用NIO ServerSocketChannel,SocketChannel也可以从单个线程中为多个客户端asynchronouspipe理连接 那么,NIO的非阻塞模式和单线程asynchronous的node.js是否遵循相同的单线程概念? 正如他们说,他们在单线程执行。

Node.js如何处理一个线程的同时请求?

我在这个问题上做了一些search,但似乎人们只强调非阻塞IO。 比方说,如果我只是有一个非常简单的应用程序来响应客户端的“Hello World”文本,无论它有多快,仍然需要时间来完成执行。 如果有两个请求同时进入,那么Node.js如何确保两个请求都将被一个线程处理? 我阅读博客了解node.js事件循环 ,其中说:“当然,在后端,有数据库访问和进程执行的线程和进程”。 这个陈述是关于IO,但我也想知道是否有单独的线程来处理请求队列。 如果是这样的话,我可以说Node.js单线程概念仅适用于在Node.js上构build应用程序的开发人员,但是Node.js实际上是在幕后的multithreading上运行的吗?

JavaScript执行引擎未指定?

我最近开始学习JavaScript。 我一直在使用Node.js和Angular创build几个月的应用程序。 令我困惑的主要方面之一是如何在JavaScript中编写asynchronous代码,而不必担心线程同步 , 争用条件等问题。 于是,我发现了一些有趣的文章( [1] , [2] ),它们解释了如何保证我写的任何代码总是由单个线程执行。 底线,我所有的asynchronous代码只是简单的安排在事件循环中的某个点执行。 这听起来非常像操作系统调度程序将在一个单处理器的机器上工作,其中每个进程计划在有限的时间内使用处理器,给我们假的并行感。 而callback就像中断 。 这篇文章没有提供任何特定的参考,所以我认为JavaScript执行引擎工作的最佳来源当然应该是语言规范,所以我给了我最新的EcmaScript 5.1副本。 令我惊讶的是,我发现这个执行行为并没有在那里指定。 怎么来的? 这看起来像是在浏览器和节点中的所有JavaScript执行引擎中完成的基本deviseselect。 有趣的是,我还没有find一个地方,这是指定的任何特定的引擎。 事实上,我不知道人们是如何看待事情的方式,就像上面提到的书籍和博客那样,如此明确地肯定了这一点。 所以,我有一套我认为有趣的问题。 我将不胜感激任何提供见解,评论或简单参考的答案,指引我正确地理解以下内容: 由于EcmaScript没有指定JavaScript执行引擎应该与事件循环一起工作,所以JavaScript的实现似乎可以这样工作,不仅在浏览器中,而且在Node.js中呢? 这是否意味着我可以实现一个新的与EcmaScript兼容的JavaScript引擎,实际上它提供了真正的multithreadingfunction,如同步locking,条件等function? 使用事件循环的这个执行模型是否会阻止我利用多核,如果我想要执行一个强烈的CPU绑定任务? 我的意思是,我一定可以把任务分成几块(正如其中一篇文章中所解释的那样),但这仍然是连续的,而不是并行的。 那么,JavaScript引擎如何利用多核来运行我的代码呢? 你知道任何其他有信誉的来源,对于任何特定的JavaScript引擎实现的这种行为是正式指定的吗? 如果我们不能假设一些关于执行环境的东西,那么代码如何能够在库和引擎之间移植呢? 这个问题看起来太多了,或许这个post太宽泛,无法回答。 如果closures,我会试着用不同的线索问他们。 但是他们都是围绕这样一个事实,即我想更好地理解为什么JavScript和Node是用事件循环来devise的,如果在某处(除了浏览器源代码之外)指定了我可以阅读并深入理解devise和决策在这里,更重要的是,要确切地知道什么是写书的人的信息来源。

Node.js中的multithreading?

我在node.js中为Windows Azure项目实现了socket.io。 我必须定期向所有连接的客户端发送数据。 我是node.js的新手,但我想multithreading是不可能的。 socket.io的目的是为了支持实时应用程序,所以有什么方法可以将数据连续不断地发送给所有连接的客户端,并同时处理客户端同时发送给socket.io服务器的任何数据? 编辑: 这大致是我的socket.io实现 var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.emit('first', "connected"); socket.on('clientData', function (data) { //processing the data }); }); function requestQueue() { // some processing io.sockets.emit('broadcast', recordsQueue); // should go to sleep for a time period } 本质上,我希望requestQueue方法像线程一样持续运行,它将以特定的时间间隔向连接的客户端发送数据。 而且,如果客户端发送任何数据到“clientData”事件,那么我应该能够接收数据并对其进行处理。 任何想法,我怎么能做到这一点? 谢谢 我的解决scheme var io = require('socket.io').listen(80); io.sockets.on('connection', function […]

node.js集群中的subprocess间通信选项

所以我现在在做一个node.js游戏服务器应用程序,在这里我碰到了一些问题。 我的问题是,我使用socket.io接受来自游戏客户端的入站连接。 这些客户端可能连接到游戏世界的几个区域或区域之一。 基本架构如下所示。 主进程为运行区域pipe理器进程的每个游戏区域分配一个subprocess; 一个专门维护区域数据的过程(三维模型,玩家/实体的位置等)。 主进程然后为其创build的每个区域pipe理器分派多个“通信线程”。 这些线程创build一个socket.io的实例并侦听该区域的端口(多个线程在单个端口上侦听)。 这些线程将在自己的进程中处理大部分游戏逻辑,并与支持游戏服务器的数据库进行通信。 唯一的问题是,在某些情况下,他们可能需要与区域经理沟通,以获得关于区域,球员等的信息。 举个例子:一个玩家想要在该区域内购买/出售/交易非玩家angular色(NPC)。 区域通信线程需要询问区域pipe理器线程,以确定玩家是否足够接近NPC进行交易,然后才允许交易发生。 我在这里遇到的问题是我打算利用node.js集群function,并使用进程的send()和on()方法来回传递消息。 除了我遇到的一个警告之外,这将是很好的。 由于cluster.fork()所有subprocess都只能与“主”进程通信。 node.js根进程成为所有通信的瓶颈。 我使用一个脚本在我的系统上运行了一些基准testing,它使用集群的进程间通信(IPC)来回传递消息,并跟踪每秒钟执行多less次中继。 看起来,最终节点以每秒约20k的速度在它可以中继的IPC数量方面达到最大值。 这个数字在Phenom II 1.8ghz四核笔记本电脑和FX-8350 4.0ghz 8核心桌面电脑上都是一致的。 现在这听起来相当高,除了这基本上意味着无论有多less区域或通信线程,所有的IPC仍然是通过一个单一的进程瓶颈,作为整个应用程序的“中继”。 这意味着尽pipe看起来每个单独的线程可以每秒钟接续20k个IPC,但是由于所有的通信都是通过一个线程进行的,整个应用程序作为一个整体将永远不会中继,即使是在一些疯狂的32核心系统上。 所以这就是我遇到的问题。 现在困境。 我已经阅读了很多有关其他各种选项,并阅读了20个不同的问题在这里堆栈关于这个话题,我已经看到了一些事情经常popup: Redis :我实际上是在我的服务器上运行Redis,并将其用作socket.io数据存储,以便多个线程中的socket.io可以共享连接数据,以便用户可以连接到N个socket.io线程为他们的区域,所以服务器可以自动负载平衡input连接。 我关心的是它贯穿networking堆栈。 对于同一台服务器上的多个进程之间的通信几乎不是理想的 我觉得延迟将是一个长期的主要问题。 0MQ(zeromq / zmq) :我以前从来没有用过这个,但最近我已经听到了一些。 根据我所做的阅读,我发现了很多人使用TCP套接字的例子,但是对于使用IPC的人来说并没有太多的嗡嗡声。 我希望也许有人在这里为IPC工作过0MQ(甚至可能在node.js中),并且可以为我提供一些启示。 dnode :我再也没有用过这个,但是从我所看到的看来,这是另外一个devise用于TCP的选项,这意味着networking堆栈再次成为可能。 node-udpcomm :有人在这里的另一个问题(这是我不能再次不幸find)连接这个。 我从来没有听说过,它看起来像一个非常小的解决scheme,打开和侦听UDP连接。 虽然这可能仍然会比TCP选项更快,但我们仍然有networking堆栈的方式吗? 我肯定喜欢在我的“程序员区”以外的一英里,就像这里,以及我不太了解的networking/计算机体系结构的东西。 无论如何,底线是我完全卡在这里,不知道在这种情况下IPC是最好的select。 我现在假设0MQ是我上面列出的最好的select,因为它是唯一一个似乎为通信协议提供了“IPC”选项,我认为这意味着它使用UNIX套接字或者是不通过networking堆栈,但我不能确认,或任何东西。 我想我只是希望这里的一些人能够足够的了解我的方向,或者告诉我我已经去了那里。 我正在开发的这个项目是一个多人游戏服务器,devise用来与多人游戏客户端“开箱即用”,并以Three.js为3Dgraphics/计算器提供动力。 客户端和服务器将在所有人都满意的情况下成为开放源代码,并且我希望确保架构尽可能地具有可扩展性,这样人们就不会在此基础上构build游戏,然后进行扩展并最终撞墙。 无论如何感谢您的时间,如果你真的读这一切:)

在.NET中使用C#可以在没有multithreading的情况下实现基于事件的asynchronous模式吗?

我为Node.js的build筑devise感到惊讶,并想知道C#是否有这样的devise能力: asynchronous,基于事件/事件循环,无阻塞I / O,无需multithreading。

有没有办法在NodeJS中做multithreading编码?

根据我的理解,只有NodeJS中的I / O是非阻塞的。 例如,如果我们做了很多沉重的math操作,其他用户在完成之前无法访问服务器。 我想知道是否有一个非阻塞的方式来做在NodeJS繁重的计算? 只是好奇。

node.js中的长时间运算

我在node.js中写了一个游戏服务器,有些操作涉及到部分服务器的大量计算。 我不想在运行这些计算时停止接受连接 – 当node.js不支持线程时,如何在后台运行它们?

有没有办法在Node.JS中的worker / threads / something中共享内存?

我有一个Node应用程序访问一个静态的,大型(> 100M),复杂的内存数据结构,接受查询,然后通过HTTP向客户端提供一小部分的数据。 大多数查询可以在十分之一秒内回答。 华丽的节点! 但是,对于某些查询,search这个数据结构需要几秒钟的时间。 这很糟糕,因为其他人都必须等待。 为了更有效地服务更多的客户,我想使用某种并行性。 但是,由于这个数据结构如此之大,我想在工作者或者线程之间分享,或者你有什么,所以我不会烧数百兆字节。 这将是完全安全的,因为数据结构不会被写入。 任何其他语言的典型“fork()”都可以。 但是,据我所知,在Node中执行并行的所有标准方法明确地使这是不可能的。 为了安全,他们不希望你分享任何东西。 但有没有办法? 背景: 把这个数据结构放在数据库中,或者使用memcached或者类似的东西是不切实际的。 WebWorker API库和类似的只允许简短的序列化消息传入和传出工作人员。 节点的群集使用名为“叉”的调用,但它不是真正的现有过程的叉,它正在产生一个新的。 所以再一次,没有共享的记忆。 可能真正正确的答案是使用文件系统访问共享内存,也就是tmpfs或mmap。 有一些节点库使得mount()和mmap()完全可以用于这样的事情。 不幸的是,人们必须在同步查询和读取之上实现复杂的数据结构访问。 我的应用程序使用数组的字典等数组。 不用重新实现就好了。

在Node.js中并行化任务

在JS中我有一些任务是资源密集型的。 对于这个问题,让我们假设他们是一些沉重的计算,而不是系统访问。 现在我想同时运行任务A,B和C,并在完成时执行一些函数D. asynchronous库为此提供了一个很好的脚手架: async.parallel([A, B, C], D); 如果我正在做的只是计算,那么它仍然会同步运行(除非库将任务放在不同的线程本身,我认为不是这种情况)。 我如何使这实际上平行? 通常情况下,asynchronous代码不会阻塞调用者(使用NodeJS时)做什么? 它开始了一个孩子的过程 ?