Articles of 并发

何时使用asynchronousnodejs?

我不是说ES7的asynchronous,但一般的asynchronous函数,如callback和promisses。 所以,我研究了关于NodeJS和事件循环。 一切都让我相信NodeJS有一种asynchronous的错觉。 据我所知,这只有当function必须通过外部媒体传递时才有效。 例如,执行一个读取文件(将被OS API使用),或者执行一个将使用外部API的请求。 我发现很less有人谈论这个问题,我想在这里和你讨论一下。 我的问题是:我是否正确的想法? 还有,如果有实际的方法来找出asynchronous工作在哪里,它不支付? 在某些情况下,如果我是正确的,asynchronous只会花费更多的内存。

node.js中的信号量 – 使用计数器variables

我一直在学习JavaScript一段时间,我似乎无法理解为什么下面的代码将无法正常工作。 我试图使主执行线等待asynchronous函数调用的结束使用信号量技术。 你可以看看这里的代码: var fs = require("fs"); var data = ""; var asyncDone = false; var fstream = fs.createReadStream("text.txt"); fstream.setEncoding("utf-8"); fstream.on("data", function (chunk) { data += chunk; }); fstream.on("end", function() { console.log("reading done"); console.log(data); asyncDone = true; }); while (! asyncDone) { } console.log("program terminating"); 任何帮助将不胜感激,谢谢。

哪些函数可以在node.js中同步工作?

例如,我正在写随机生成器与crypto.randomBytes(…)以及另一个asynchronous函数。 为了避免callback地狱,我虽然我可以使用crypto.randomBytes的同步function。 我的疑问是,如果我这样做,我的节点程序将停止每次执行代码? 然后,我想如果有一个asynchronous函数列表,它们的运行时间很短,这些函数可以作为同步函数,那么使用这个函数列表进行开发将非常容易。

在PostgreSQL中重新启动一个失败的事务

通过事务我的意思是几个SQL语句包装(例如)在一个begin isolation level serializable块。 并发事务可以使这个事务失败,即回滚。 如何在PostgreSQL中重启失败的事务?

Node.js Cluster + Express总是调用同一个worker

我正在尝试使用群集模块来处理与Express同时多个http请求。 通过下面的代码,我可以产生多个工作人员,并让他们都在同一个端口上进行监听。 大的for循环是模拟Web服务器上的重负载。 我想看到的是,如果工作人员在第二个请求进入时正忙于处理一个http请求,则会调用另一个worker并处理该第二个请求。 相反,当我尝试使用curl发出多个请求时,所有请求都由一个工作人员顺序处理; 即使他们已经分叉,也没有其他的工人被调用过。 难道是我使用Express不正确? 提前致谢! var cluster = require('cluster'); if (cluster.isMaster) { var cpuCount = require('os').cpus().length; for (var i = 0; i < cpuCount; i += 1) { cluster.fork(); } } else { var http = require('http'), app = require('express')(); http.createServer(app).listen(31415, function () { console.log(process.pid + " listening on 31415"); }); app.get('/', […]

SailsJS +水线并发数据库请求与承诺

我对SailsJS的吃水线并发性有些困惑。 目前我正在做这样的数据检索; var results = {}; // Get user by id 5 User.find('5', function(err, user) { results.user = user; // when it resolves, get messages Message.find({userId: '5'}, function(err, messages) { results.messages = messages; // when message query resolves, get other stuff OtherStuff.find({userId: '5'}, function(err, otherStuff) { results.otherStuff = otherStuff; res.view({results}); }); }); }); 问题是数据库调用不是并发的。 每一个请求都在先前的承诺完成之后启动。 […]

Node.js Promise没有按顺序执行

在我启动Web服务器之前,我想为configuration文件创build一些本地目录,而不是 // app.js var fsPromise = require('./fs-promise.js'); var httpPromise = require('./http-promise.js'); var promise = require('promise'); promise.all([fsPromise.createDir('configs'), fsPromise.createDir('logs')]) .then(httpPromise.startServer()); // fs-promise.js var fs = require('fs'); var promise = require('promise'); module.exports = { … createDir: function(directory) { return new promise(function(fulfill, reject) { //console.log('Creating new dir: ' + directory); var newDir = __dirname + "\\" + directory; fs.mkdir(newDir, […]

有没有办法在Redis获得locking? (Node.js的)

我的Node.js应用程序接受来自外部的连接。 每个连接处理程序在Redis上读取一个SET,最终修改该集合,然后继续。 问题是与此同时另一个asynchronous连接可以尝试读取相同的SET并尝试更新它或根据它读取的内容决定下一步。 我知道Redis尽力去做primefaces,但是这对于我的用例还不够。 想一想:设置被读取,以了解它是否满(有一个商业规则)。 如果它是完整的,那么会发生一些事情。 问题是,如果只剩下一个插槽,则两个半并发连接可以认为每个连接都是最后一个。 我得到溢出。 我有一种方法来保持连接“等待”很短的时间,其他最终需要更新设置状态? 我认为这是一个angular落的情况,非常非常不幸…但你知道:) 使用另一个键作为“锁”是一个选项,还是它臭?

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直到现在,但这导致我的代码很尴尬,容易中断。