Tag: 并行处理

并行进程使用asynchronousfs.appendFile(文件,文本,callback)追加txt文件是不错的主意,

我正在开发将开始使用的node.js应用程序 for(i=0; i<os.cpus().length; i++) { cluster.fork(); } 每个节点工作人员将使用node.js函数asynchronous写入一个公共文件 fs.appendFile(file, text, callback) 在这种情况下,并行写入每个节点worker的一个文件。 我不确定这个parralel追加是否会减慢数据保存到文件的速度。 是否可以保存的数据被破坏,因为有平行的写作? 我想知道是不是每个节点工作人员都要写一个自己的文件(比如,如果有8个工人,数据要保存在8个单独的文件中) 该应用程序将被部署在基于UNIX的系统上。 提前致谢

NodeJS sqlite3并发访问

基本上我有一个数据库没有多less出现,但可悲的是两个分组。 首先,对数据库有一个写访问权限。其次,有一个读访问权限。 读访问失败,并显示数据库被locking的消息( { [Error: SQLITE_BUSY: database is locked] errno: 5, code: 'SQLITE_BUSY' } ),这是完全正常的。 但是,我怎样才能让我的读取访问等待数据库closures? 我目前的代码: var sql = "INSERT INTO chickenmilk (userID,channelID,message) VALUES (?,?,?)" db.run(sql, userID, channelID, bot.fixMessage(message), function(err) { console.log(err); db.close(); }); 并发: var sql = "SELECT userID, COUNT(message) as count FROM chickenmilk WHERE channelID LIKE ? GROUP BY userID"; db.all(sql, data, […]

高内存/性能关键计算 – 架构方法观点

我需要一个架构观点和方法来解决以下问题: 介绍: 我们有一个~4M行的表称为Purchases 。 我们也有一个~5k行的表,称为Categories 。 另外,我们有一个~4k SubCategories的表。 我们正在使用T-SQL来存储数据。 在用户请求(在运行期间),服务器接收到大约10-15个可能参数的请求。 根据参数,我们采购,按类别和子类别进行分类,并进行一些计算。 “计算”的一些过程包括过滤,分类,重新安排采购领域,相互减less采购,增加一些其他采购,find储蓄等等。 这个过程是用户特定的,因此每个用户将根据他们的angular色获得不同的数据。 问题: 这个过程大约需要3-5分钟,我们希望把它裁掉。 以前,这个过程是通过webworkers(JS)在浏览器中完成的。 随着内存开始变大,大多数浏览器开始加载失败,我们已经离开了它。 然后,我们将服务移动到服务器(NodeJS),通过subprocess即时处理请求。 subprocess的原因:计算进程经过for循环大约5000倍(对于每个类别)并执行上述“计算”。 通过subprocess,我们能够将工作分配到#ofsubprocess中,如果我们运行了至less16个内核(16个subprocess),则可以获得更好的结果。 目前的处理时间下降到大约1.5-2分钟,但我们想看看我们是否有更好的select。 我明白它很难完全理解我们的目标,而没有看到任何代码,而是专门提出问题。 在运行时对半大数据进行计算的方法有哪些? 我们有一些想法: 使用SQL内存表,并在SQL中进行计算 使用azure色批处理服务 使用更大的机器(〜32-64内核,如果我们不能得到任何其他的想法,这可能是我们最好的select,但是当然,成本增加了很多,但是我们接受成本会增加的事实) 步入hadoop生态系统(或其他大数据生态系统) 其他一些有用的事实: 我们的购买量约为1GB (对于内存计算来说有点过大) 我们正在考虑在redis上进行预计算和caching,以便为客户端准备好一些数据(我们将使用他们的帐户中的参数设置每天预先计算,但客户端往往会频繁更改这些参数,因此我们有有一些有效的方式来处理未caching和预先计算的数据) 如果我们可以提供更多的信息来更好地理解我们的困境,请发表评论,我将尽可能提供更多的信息。 如果可能的话,将会有太多的代码粘贴到这里来完全理解algorithm,因此我想尝试用单词来提供我们的问题。

async.parallel是否也会阻塞代码?

我试图理解async包在代码并行化方面的行为。 据我所知,为了避免callback地狱/汤,结构代码是有帮助的,但这是唯一的优势吗? async.parallel([ function(next) { apiCallTo3rdParty(next); }, function(next) { apiCallTo3rdParty(next); }, function(next) { apiCallTo3rdParty(next); } ], function(err, res) { // do something else with returned data }); 在上面的代码中,所有三个API调用都将在不等待另一个完成的情况下进行。 根据规格。 最后的callback将在最长的API调用返回之后调用,因为其余的将在之前完成。 但是,如果我改变了代码,使它成为一对阻塞操作,会发生什么? async.parallel([ function(next) { sleep(5); }, function(next) { sleep(5); }, function(next) { sleep(5); } ], function(err, res) { // do something else with returned data […]

有没有等效的asynchronous库,但对于node.js的child_processes

在节点中stream行的asynchronous库在处理asynchronous函数的复杂控制结构方面做了很多工作。 例如,假设我有一个银行帐户ID的集合,我想从一个API中检索余额,然后对余额进行求和。 我可以通过做这样的事情来实现asynchronous: var accountIds = [0001,0002,0003,0004,0005,0006] async.mapLimit(accountIds, 3, function fetchBalance(accountID, cbk) { var balanceURL = "http://someapi.com/account/balance/" + accountID; get(balanceURL, cbk); }, function end(err, balances) { if (err) { console.err(err); } console.log(sum(balances)); } ); 这使我不必编写pipe道,以跟踪同时分派多less个asynchronous函数,确保所有函数最终完成,跟踪错误等。另外,它在节点中工作良好,因为I / O(以networking请求)是这个程序的限制因素。 但是,让我们设想一下,不是有单独的任务是I / O绑定的,我们有单独的CPU绑定任务。 asynchronous不会给我任何真正的性能好处,因为node.js只会运行一个主线程。 在节点中并行处理这种工作负载的一种解决scheme可能是使用child_process库并生成一堆工作进程来处理CPU绑定的工作。 我的问题是,是否有一个库可以处理这些工作stream的pipe道/协调,如asynchronous为I / O绑定,asynchronousfunction? 如果没有,这是否值得写? 我认为这可能是一个有趣的练习。

并行数据库请求从Node.js SDK到Couchbase

我希望能够在短时间内向Couchbase商店发出几个Get请求,比如在半毫秒内。 我不能使用multiGet,因为我没有同时拥有所有的密钥。 但是,如果我很快发出了几个单独的获取请求,我相信他们将一次处理一个,如http://docs.couchbase.com/couchbase-devguide-2.5/index.html#retrieving-多键 。 我可能做的一件事情是在启动时为每个Get请求创build一个单独的Connection对象,但是我没有看到在任何地方推荐这个最佳实践。 这样的工作,即允许我快速并行获取并且是推荐的事情吗?

Node.js支持并行吗?

我一直在研究并发和并行的区别。 Rob Pike在谈到关于并发性和并行性之间的差异时,在YouTube上发表了一个演讲。 他的演讲是在Google Go语言的背景下进行的。 据我所知,并发是能够处理多种事情的devise,而并行则是多个事物同时物理执行。 从我也明白,Node.js作为一个单线程进程运行。 因此,尽pipeNode支持并发执行callback的方式,它是否有能力处理任务的并行执行? 它可以设置为在单独的处理器上运行多个线程?

asynchronous并行请求正在顺序运行

我正在运行一个服务器使用Node.js,并需要从我运行的另一台服务器( localhost:3001 )请求数据。 我需要向数据服务器发送多个请求(〜200)并收集数据(响应大小从〜20Kb到〜20Mb不等)。 每个请求都是独立的,我想将响应保存为一个巨大的数组: [{"urlAAA": responseAAA}, {"urlCCC": responseCCC}, {"urlBBB": responseBBB}, etc ] 请注意,这些项目的顺序并不重要,理想情况下应该按照数据可用的顺序填充数组。 var express = require('express'); var router = express.Router(); var async = require("async"); var papa = require("papaparse"); var sync_request = require('sync-request'); var request = require("request"); var pinnacle_data = {}; var lookup_list = []; for (var i = 0; i < 20; i++) […]

作为一个单独的node.js进程运行一个函数?

是否有可能作为一个完全独立的node.js过程来运行一个函数? 例如: var parallel = require("parallel"); parallel(function(){ var app = require("express")(); app.on("/",function(req,res){ res.send("hi"); }); app.listen(80); },function callback(err,stdout){ console.log("process terminated!") }); 是这样的可能吗?

并发请求到node.js,connect-mongo,会话被覆盖

在当前的一个项目(一种商店系统)中,我使用了expressJS和connect-mongo作为会话存储的node.js。 在客户端,我在启动时使用单个请求来创build一个新的会话,然后将多个并行请求发送到node.js服务器。 由于这些并行请求会改变会话,所以这些改变似乎会相互覆盖,当然这些改变会改变会话的不同对象。 示例(全部3个请求同时开始): 请求A将一些产品推送到数组req.session.productHist['abc'] 请求B将产品推送到req.session.productHist['def'] 请求C需要一些时间,但不会改变会话 由于请求C在请求A和B之后完成,但是在完成之前开始,所以似乎用请求C开始时所保持的值覆盖session.productHist (null)。 我怎样才能解决这个问题? 更新: 控制台输出的一些示例代码: var url = require('url'), express = require('express'), MongoStore = require('connect-mongo'); var aDay = 24*60*60*1000; var app = express.createServer(); app.configure(function(){ app.use(express.cookieParser()); app.use(express.session({ secret: "secret", store: new MongoStore({ db: 'lmsCache' }), maxAge: aDay }) ); app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); app.use(app.router); app.use(express.logger()); […]