Tag: multithreading

将jscallback函数传递给另一个线程调用的ffi函数是否安全?

说我有一个C函数,它需要一个callback,并在另一个线程上调用它: void call_in_new_thread(void (*callback)()) { // spawn a new thread and call `callback` in it … } 现在我想通过Node-FFI从javascript调用这个函数,并传递一个javascript函数: var callbackType = 'pointer' var lib = ffi.Library('mylib', { 'call_in_new_thread': [ 'void', [ callbackType ] ], }) var callback = ffi.Callback('void', [ 'void' ], function() { // which thread I'm in now? console.log("hello!") }) lib.call_in_new_thread(callback) 我的问题:有效吗? 线程安全吗? […]

NodeJ如何处理如此多的传入请求,是否使用线程池?

当请求进入nodejs服务器时,它是如何处理请求的? 我知道它有不同的处理请求的方式,因为它不会为每个请求产生一个新的线程(或者我猜它不会使用传统的线程池)。 有人可以向我解释底下发生了什么事,而linux的味道在这里呢?

Node实际创build了多less个线程?

在阅读了关于Node的线程本质的这个很好的回答之后,我开始使用UV_THREADPOOL_SIZE系统variables来改变线程池的大小,并且发现了一些有趣的东西: 当我设置 process.env.UV_THREADPOOL_SIZE = 10; 我得到15个线程在我的节点进程(我认为它应该是10 + 1主节点线程= 11)。 看看我的脚本: process.env.UV_THREADPOOL_SIZE = 10; //init thread pool by calling `readFile` function require('fs').readFile(__filename, 'utf8', function(err, content) {}); //make node not exiting setInterval(function() {}, 1000); 运行后,我input: ps -Lef | grep test.js | grep -v grep 并得到以下结果: olegssh 4869 4301 4869 0 15 16:38 pts/0 00:00:00 /home/olegssh/node/bin/node test.js olegssh […]

如何selectNode.js和JXcore?

JXcore似乎改进了Node.js。 检查这个精心devise的报价: JXcore带有内置的multithreading支持,可以在现有的Node.js应用程序上启用,而无需额外的更改… JXcoremultithreading可能带来比Node.JS集群模块大约30%至50%的稳定性能优势。 从http://jxcore.com/ 我已经尝试安装它,它确实工作。 这就是我现在可以说的,测量性能和正常运行是棘手和精细的。 那么切换到JXcore是否有真正的优势,以及如何做出决定?

在Express / Node中使用sendFile时发生随机'ECONNABORTED'错误

我已经用Express中间件设置了一个节点服务器。 当加载一个触发大约10个其他负载(js,css等)的HTML文件时,我会在某些文件上随机获取ECONNABORTED错误。 确切的错误是: { [Error: Request aborted] code: 'ECONNABORTED' } 由这个简化代码生成(在我尝试debugging问题之后): res.sendFile(res.locals.physicalUrl,function (err) { if (err) console.log(err); … } 很多post都提到由于没有指定完整path名而导致的这个错误。 这不是这里的情况。 我确实指定了完整的path,而且错误是随机生成的。 有时候,页面及其后面的所有链接都可以完美加载,有时甚至没有。 我试图刷新caching,并没有find任何模式来连接它与此。 这个特定的错误似乎是套接字连接中止的一个通用术语,并在其他应用程序(如FTP)的上下文中讨论。 意识到节点工作线程可以增加,我试图这样做使用: process.env.UV_THREADPOOL_SIZE = 20; 然而,我的理解是,即使没有这个,最多文件传输可能不得不等待一个工作线程是免费的,不会被中止。 我不是在这里谈论大文件,所有文件都小于1 MB。 我有一个直觉,这与节点直接无关。 请指出任何其他的可能性(节点或其他)来处理这个错误。 另外还有其他的间接解决scheme吗 重试几次可能是一个,但这将是笨拙的。 编辑:不,我不能重试。 标题已经发送错误! 一边注意:许多使用sendFile的示例跳过使用callback,从而给人的印象是一个同步调用。 不是这样。 请始终使用callback,检查是否成功,然后才能转到“下一个”中间件,或者如果发送失败,采取适当的步骤。 如果不这样做,可能会使debuggingasynchronous环境中的后果变得困难。

节点JS单线程Vmultithreading(CPU利用率:有什么区别?)

最近我已经开始阅读关于Node的很多东西了,从差异化的angular度来看,我不能清楚地理解的是,asynchronous与同步调用如何处理I / O的真正区别。 据我所知,在一个multithreading的同步环境中,如果启动I / O,正在运行的线程将被抢占,并返回到等待状态。所以基本上这与NodeJSasynchronousI / O调用发生的情况相同。 在Node JS中,当I / O被调用时,I / O操作被移出当前正在运行的线程,并被发送到事件解复用器以完成和通知。 只要I / O完成,callback方法将被推送到事件队列以进一步处理。 所以,我看到的唯一区别是在节点JS我们节省内存(由于每个线程拥有多个调用堆栈)和CPU(由于没有上下文切换保存)。 如果我只是考虑有足够的内存来购买,那么仅仅由于上下文切换而节省CPU是否会造成巨大的性能差异? 如果我的上述理解是不正确的,那么Java线程Vs Node JS的I / O处理如何保持CPU繁忙并且不浪费CPU周期。我们是否仅使用Node JS节约了上下文切换CPU周期,更多的呢? 基于这些回应,我想补充一个场景: 请求A,请求B同时来到J2ee服务器。 每个请求在这个multithreading环境中需要10ms才能完成。在10ms的时间内,执行代码逻辑需要5ms的时间来计算一些逻辑,并且在I / O中花费5ms来从DBMS中提取大的数据集。调用DBMS是代码的最后一行,然后将响应发送到客户端。 如果同一个应用程序转换为节点JS应用程序,则可能发生这种情况 请求A来,5毫秒用于处理请求。 DBMS调用是从代码中调用的,但是它不是阻塞的。所以一个callback方法被推送到事件队列。 在5ms之后,请求B被服务,并且再次请求B被推送到事件队列以用于I / O完成。请求B需要5ms的处理。 事件循环运行,请求A的pickupscallback处理程序,然后将响应发送到客户端。因此,响应在10 ms后发送,因为Req A和Req B都需要5 ms用于同步代码块处理。 现在在这种情况下保存的时间在哪里?除了上下文切换和创build2个线程。 需求A和需求B无论如何都花了10毫秒与节点JS。 ?

JavaScript中的竞争条件与复合赋值

我不是在谈论涉及networking或事件的复杂的竞争条件。 相反,我似乎已经发现+=运算符在V8(Chrome 58或者Node 8)中不是primefaces的。 下面的代码旨在并行运行两个所谓的线程。 每个“线程”重复调用一个函数,该函数在睡眠几秒后返回其数字参数。 结果总结成一个累加器。 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // Return the passed number after sleeping that many seconds async function n(c) { await sleep(c * 1000); console.log('End', c); return c; } let acc = 0; // global // Call n repeatedly and sum up results async […]

Nodejs的内部线程池是如何工作的?

我已经阅读了很多关于NodeJs如何工作的文章。 但是我仍然无法弄清楚Nodej的内部线程是如何进行IO操作的。 他在回答https://stackoverflow.com/a/20346545/1813428时说,NodeJ的线程池中有4个内部线程来处理I / O操作。 那么如果我有1000个请求同时发生,每个请求都要做I / O操作,比如从数据库中检索一个巨大的数据。 NodeJs将这些请求分别传递给这4个工作线程而不阻塞主线程。 所以NodeJs可以同时处理的最大I / O操作数是4次操作。 我错了吗?。 如果我是对的,剩余的请求将在何处处理? 主要的单线程是非阻塞的,不断驱动对相应的运算符的请求,那么这些请求将在哪里去,而所有的工作线程是充满任务? 。 在下面的图片中,所有的内部工作者线程都充满了任务,假设他们都需要从数据库中检索大量的数据,主要的单线程继续向这些工作人员提出新的请求,这些请求将在哪里去? 它有一个内部任务quese来存储这些请求?

事件驱动和基于线程的服务器系统有什么区别?

Node.js是一个事件驱动的I / O,它是一个单线程的服务器,对callback起作用,永远不会阻塞主线程。 但是它是如何处理非阻塞I / O的呢? 如果它确实容易pipe理,为什么不基于线程的系统pipe理呢? 不像其他线程(在单个事件驱动线程之后)像基于线程的工作? 如果其他线程表示工作者(在事件驱动线程后面)忙碌,那么它仍然可以不受阻塞地处理工作? 基于线程的模型将任务分配给线程,如果没有空闲线程,则阻止新任务。 如果一个线程可以像处理每个I / O而没有阻塞的事件驱动的单线程一样处理多个任务,那么为什么基于线程的系统在忙线程中不使用这种策略来阻塞I / O。 我想知道事件驱动和基于线程的服务器系统有什么区别( 优点/缺点 )。

如何在Windows上运行节点群集?

任何人都知道如何在Windows上运行节点群集? 我一直没有find网上的任何文章,似乎无法解决这个问题: events.js:160 throw er; // Unhandled 'error' event ^ Error: write ENOTSUP at exports._errnoException (util.js:1007:11) at ChildProcess.target._send (internal/child_process.js:634:20) at ChildProcess.target.send (internal/child_process.js:521:19) at sendHelper (cluster.js:751:15) at send (cluster.js:534:12) at cluster.js:509:7 at SharedHandle.add (cluster.js:99:3) at queryServer (cluster.js:501:12) at Worker.onmessage (cluster.js:449:7) at ChildProcess.<anonymous> (cluster.js:765:8) 而代码… if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) […]