Tag: 并发

Go会阻止像Node这样的处理器密集型操作吗?

Go对于并发是很好的,任务作为例行程序传递,并且例行程序在虚拟处理器中处理,每当一个例行程序遇到阻塞操作(数据库调用)时,将例行程序移动到另一个虚拟处理器在不同的线程上,这是大多数时间在另一个物理处理器上运行的…现在,我们实现了并行性。 Node.js有一个类似的技术(除了一切发生在同一个线程上),但是把所有正在等待的虚拟进程放在一个等待队列中,直到它们从阻塞资源(DB,URL)接收到响应,然后发送它们进行处理。 Node.js的缺点是无法处理处理器密集型操作(for循环就是一个例子),而虚拟进程正在运行,所有的时间都将耗尽,直到完成而没有抢占,这就是为什么Node.js是明智的在用于关键系统之前,尽pipe它具有很高的并发可用性。 是的,Go产生了一个新的线程来处理阻塞执行程序,但是处理器密集型操作又是如何被认为是相同的,还是会受到Node问题的困扰?

保护Node.js中的竞争条件

我正在经历Node.js中的竞争条件,如下所示: 请求A到达,读取会话。 请求B到达,读取会话。 请求B修改会话,响应结束时写入会话。 请求A写入会话。 B的修改丢失了。 有什么办法可以解决这个问题? 我正在使用Connect与session中间件和connect-mongo中间件将我的会话存储在MongoDb中。 我可以根据需要修改中间件,但是我更愿意使用现有的解决scheme,因为在并发问题上我不是最有经验的程序员。 对我来说最重要的是解决scheme必须超越一个过程。 我研究过各种信号量/互斥量的可能性,但似乎没有一个可以扩展。 对于那些build议我围绕这个问题编写我的客户端代码的代码 – 围绕竞争条件编码一直是我的MO直到现在,但这导致我的代码很尴尬,容易中断。

使用setTimeout时node.js处理stream反压

对于我之前从这个问题中遇到的进一步问题,这是一个问题: nodejs:从文件读取并存储到数据库,限制最大并发数据库操作 问题: 我想稍后重新安排一些操作,但是这是打破了我处理背压的方法。 详情: 我有一个CSV文件,我正在阅读作为一个stream,并使用转换转换为JSON,然后asynchronous存储每一行​​数据库。 由于行被转换处理,它们被放置在负责发出数据库操作的asynchronous队列上。 例如 parser._transform = function(data, encoding, done) { var tick = this._parseRow(data); dbQueue.push(tick, function(err, result) { if (typeof(err) != 'undefined') { console.log(err) } }); this.push(tick); done(); } 当队列饱和/空时,通过暂停和恢复parsing器来处理背压: dbQueue.saturated = function() { parser.pause(); } dbQueue.empty = function() { parser.resume(); } 我一直试图做的改变是,当一个项目从队列中被取消时,将来有条件地重新调度一段时间(100ms): var dbQueue = async.queue(function(data, callback) { if (condition) […]

如何用多核CPU来提高游戏服务器的性能

如何通过mutil-core cpu提供游戏服务器性能我的观点: 一个繁忙的过程使一个核心忙,如果只有一个繁忙的过程,非常糟糕。 多进程进程并监听不同端口上的并发连接 多进程不能直接共享内存数据。 他们需要沟通。 他们可以在socket,fp socket和redis中进行通信 单独的游戏服务器转化为不同的function,每个function都是一个独立的过程,某些function可以是并行过程。 如果我的观点是正确的,我的问题是: 什么是进程之间沟通的最佳方式,保持数据同步,最好的办法就是快速简单。 我正在使用nodejs,但是我认为对于这个主题也是一样的。 编辑: 按function分片或分离,效果更好

处理NodeJSasynchronous行为

使用NodeJS和MongoDB + Mongoose。 首先,我知道asynchronous非阻塞代码的优点。 所以我处理callback。 但最后我遇到了以下问题。 可以说我有一个可以随时被用户调用的函数。 有可能,一个超级“闪电般”的用户几乎在同一时间调用它两次。 function do_something_with_user(user_id){ User.findOne({_id:user_id}).exec(function(err,user){ // FIND QUERY // Do a lot of different stuff with user // I just cannot update user with a single query // I might need here to execute any other MongoDB queries // So this code is a set of queries-callbacks user.save() // […]

使用Express中间件进行每个请求的模块configuration?

假设对我的应用程序的每个请求都包含一个MAGIC头,并且我想在某处注入该头的值,而不更新所有的请求方法。 听起来这是中间件的工作,对吧? 但是这将是线程安全的吗? 在有多个请求可能同时在运行的环境中,有没有办法使用Express中间件来执行此操作? 换句话说,我在询问示例代码中的Express中间件是设置全局共享variables还是每个请求都由独立线程处理,其中myconfig是每个请求的独立副本。 示例代码: var assert = require('assert'); var sleep = require('sleep'); var express = require('express'); var app = express(); var myconfig = {}; app.use(function(req, res, next) { myconfig.MAGIC = req.headers['MAGIC']; next(); }); app.get('/test', function(req, res) { // Pause to make it easy to have overlap. sleep(2); // If another request comes in […]

如何在Node Js应用程序的多个实例之间同步对象

是否有任何locking节点JS应用程序中的任何对象。 是否有多个应用程序实例可用某些function不应该并发运行。 如果实例A函数完成,应该解锁该对象/键或应用程序的一些标识符和B实例应该检查它的解锁是否应该运行一些function。 任何对象或键都可以用来识别locking和解锁function。 如何在具有多个实例的NodeJS应用程序中这样做。

Node.JS不同的asynchronous链怎样才能让共享variables没有问题?

我着迷于Node JS,并且已经开始潜入,但是,来自Java背景,我被下面的例子搞混了,在这个例子中,一个asynchronous调用链依靠一个共享variables来跟踪(这样来确定何时他们已经完成了另一个行动)。 我很抱歉,如果这个问题是过分基本的,但是我一直在寻找这个,并没有find解释,我可能不会使用正确的条款。 如果你在Java中做了这样的事情,你需要使variablesn同步,以避免碰撞,否则它的完整性可能会受到损害(这只是基于pseduo代码,基于一些更复杂的例子,如果它不是完美的, var n = 100 var funct_a = function(callback) { return function() { if (n == 0) callback() else n– } } for ( a in someArray) { funct_a (function() { //do something with variable a… }) } 它们是否只在一个“线程”中运行,因此它们实际上并不是在不同的CPU核上运行,而是不能实际同时写入该variables? 对于我来说,这似乎是唯一合乎逻辑的解释,可以解决这些types的冲突的一些核心节点服务器逻辑。 任何信息,以表明赞赏。

为什么node.jsasynchronous模块在使用async.eachLimit(array,limit,function,callback)的第一步之后停止?

如果我使用这个代码: async.eachLimit(body.photos.photo, 10, function(photo) { var flickr_getphoto_path = "….."; request.get({url: flickr_host_url + flickr_getphoto_path, json: true}, function(error, response, body) { if (!error && response.statusCode == 200) { console.log("SIZES LENGTH: " + body.sizes.size.length); var source_url = body.sizes.size[body.sizes.size.length – 1].source; request(source_url).pipe(fs.createWriteStream(path_for_downloads + path.basename(source_url))); } }); } 处理在10个请求后(即在第一个周期之后)停止。 应该有10个周期。 有人知道为什么它不能正常工作?

node.js http服务器并发问题

每当我尝试发送连续快速的HTTP POST,服务器有时崩溃(java.net.ConnectException:连接被拒绝:连接),有时会冻结(没有错误,但不能再使用它),有时工作…. 如果我将HTTP Post慢慢发送到服务器,似乎没有任何问题。 我在node.js中有一个http服务器的简单代码 – 我的猜测是有时NodeJS服务器会收到一个请求,然后在发送响应之前接收到另一个请求,从而导致各种问题。 如何让我的服务器能够同时接受多个请求? var server = http.createServer(function (req, res) { if (req.method != 'POST') { res.end(); } else { req.on('data', function(chunk) { //Do some stuff here file1=JSON.parse(chunk.toString()); console.log("Hello World") ; } req.on('end', function() { res.writeHead(200, "OK", {'Content-Type': 'text/html'}); res.end(); }); } } server.listen(9000); 编辑这里是发送HTTP POST的Java程序 public static String httpUrlRequest(String requestURL, […]