Tag: multithreading

Node.js C ++ addon:来自不同线程的多个callback

我正在创build一个节点C ++插件,应该callback一个JS函数,因为事件是由不在我的控制下的其他线程触发的(它实际上是一个来自我使用的托pipeDLL的.NET线程)。 由于JS世界是单线程的,我不能只保留js函数引用,并从非js线程调用它。 我甚至不能创build我想传递给该线程callback函数的参数。 我已经看到uv_queue_work被用在你想要从js线程移出工作的情况下,并且一旦完成并从js线程callback来做你需要做的任何事情,比如callback一个js函数。 为了以后的参考,这里是该函数的签名: int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb); 调用uv_queue_work对于一次性工作是很好的,我可能会经常通过从after_work_cb链接调用uv_queue_work来调用我,而work_cb与其他线程同步,但是我不知道是否没有更直接的方法这样做。 就像node.js提供的fn一样,它可以被任何其他线程直接调用,而fn指针指向下一次在主js线程上执行的代码。 任何想法?

为什么我的活动监视器使用multithreading显示Node.js?

我在OSX中打开了我的活动监视器,看看Node是如何相处的,令我惊讶的是它使用了8个线程。 怎么能在!!?

如何执行/中止JS中的长时间运行的任务?

具有Mongo DB的NodeJS服务器 – 一个function将从DB生成报告JSON文件,这可能需要一段时间(60秒以上 – 必须处理数十万条logging)。 我们希望将其作为后台任务运行。 我们需要能够启动一个报表生成过程,监视它,并在用户决定更改参数并重新构build时终止它。 节点最简单的方法是什么? 不要真的想进入单独的工作服务器处理工作,消息队列等领域 – 我们需要保持在同一个盒子和相当简单的实现。 1)作为asynchronous方法启动构build,并返回给用户,与socket.io报告进度? 2)分离构build脚本的subprocess? 3)使用类似https://www.npmjs.com/package/webworker-threads ? 用我看过的几种方法,我就陷在了同样的两个方面。 1)如何监控进度? 2)如果用户重新提交数据,如何中止现有的构build过程? 任何指针将不胜感激…

在节点模块中使用群集

更新:即使这种情况是不现实的,根据意见,我仍然感兴趣的是如何可以编写一个模块,利用集群,而不是每次重新运行父进程。 我正在尝试编写一个名为mass-request的Node.js模块,通过将其分发到subprocess来加速大量的HTTP请求。 我的希望是,在外面,它是这样工作的。 var mr = require("mass-request"), scraper = mr(); for (var i = 0; i < my_urls_to_visit.length; i += 1) { scraper.add(my_urls_to_visit[i], function(resp) { // do something with response } } 为了开始,我为群发请求模块添加了一个框架。 var cluster = require("cluster"), numCPUs = require("os").cpus().length; module.exports = function() { console.log("hello from mass-request!"); if (cluster.isMaster) { for (var i = 0; […]

node.js中的低优先级作业

基于节点使用单一线程来pipe理所有事情的事实,我很好奇我应该如何去处理一个低优先级的工作 这项工作是不断运行和分析数据(假设它是一个setTimeout ),但是它需要花费很多时间,我希望它在调度程序中具有非常低的优先级。 我不认为我可以在一个单独的过程中运行它,因为我需要经常修改它的工作指令(它使用我主进程的variables,所以它需要能够不断地访问它们)。 你可以把它想象成一大堆任务,它会一直工作,但是这些任务的工作集是由主进程控制的。 一个单独的过程需要两个人之间交换数据的不断请求,所以这似乎是一个坏主意 一个单独的线程,像networking工作者,可能会更快? 我不知道节点是否支持它们 最好的事情是将它作为一个运行在定时器上的简单事件函数,这个函数尊重节点的原则,但是我需要告诉调度器在这个函数上花费的时间比在程序的其余部分花费的时间less。 有什么办法吗?

如何增加使用集群的NodeJS服务器的吞吐量?

我有一个NodeJS服务器(Express),并使用nodeJs站点上的集群模块示例将请求分发到多个处理器。 if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); }; cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); cluster.fork(); }); } else { server.listen(app.get('port'), function(){ console.log('HTTP server on port ' + app.get('port') + ' – running as ' + app.settings.env); }); // setup socket.io communication […]

在NodeJS中处理长时间运行的进程?

我已经看到一些较旧的post涉及这个主题,但我想知道当前,现代的方法是什么。 这个用例是:(1)假设你想在一个video文件上做一个长时间运行的任务,比如60秒 ,说jspm install可能需要60秒。 (2)你不能细分任务。 其他要求包括: 需要知道任务何时完成 很高兴能够停止正在运行的任务 稳定性:如果一个任务死亡,它不会closures服务器 需要能够处理100个同时请求 我见过这些解决scheme: nodejssubprocess webworkers 光纤 – 不用于CPU绑定的任务 生成器 – 不用于CPU绑定的任务 https://adambom.github.io/parallel.js/ https://github.com/xk/node-threads-a-gogo 任何其他? 现代的,基于标准的方法是什么? 而且,如果nodejs不适合这种types的任务,那么这也是一个有效的答案。

libuv工作线程或工作队列运行状况检查?

在libuv中,最终可能会在工作线程中绑定太多的工作或错误的代码。 有一个简单的函数可以检查工作线程或线程队列的健康状况吗? 它不一定是100%确定性的,毕竟不可能确定工作线程挂在慢代码还是无限循环上。 所以下面的启发式都是好的: 尚未处理的排队项目数。 如果这太大,可能意味着工作线程繁忙或挂起。 libuv是否有任何线程处理机制,如果工作线程在n秒内不检查,它会被终止?

node.js只强制一个线程执行代码

当我启动我的应用程序node app.js ,运行的进程只有1个线程。 不过运行的时间越长,进程的线程就越多。 问题是,当我想执行这样的特定types的代码: var io = require('socket.io')(process.env.PORT); 它失败了,因为信号是从多个线程发送的,因此代码没有成功执行。 简单的testing,如果这样做: var io = require('socket.io')(9001); var io = require('socket.io')(9002); var io = require('socket.io')(9003); var io = require('socket.io')(9004); 它工作正常,但是这个代码: var cPort = 9001; setInterval(function() { var io = require('socket.io')(cPort); cPort++; }, 1000 * 60 * 2); // 1 sec * 60 seconds * 2 = 2 […]

Webworker线程:是否可以使用内部工人“要求”?

(使用Sails.js) 我正在为Node上长时间运行的进程testingwebworker-threads( https://www.npmjs.com/package/webworker-threads ),下面的例子看起来不错: var Worker = require('webworker-threads').Worker; var fibo = new Worker(function() { function fibo (n) { return n > 1 ? fibo(n – 1) + fibo(n – 2) : 1; } this.onmessage = function (event) { try{ postMessage(fibo(event.data)); }catch (e){ console.log(e); } } }); fibo.onmessage = function (event) { //my return callback }; […]