Tag: libuv

在类中使用libuv

我正在尝试为C ++库编写一个nodejs绑定,我似乎遇到了一个障碍。 我正在努力使所有的C ++库的调用asynchronous,这就是为什么我使用libuv 。 我基本上是按照这个教程。 我想能够从libuv的uv_queue_work调用类成员函数。 看看这个代码 – class test { private: int data; void Work(uv_work_t *req); void After(uv_work_t *req); public: Handle<Value> Async(const Arguments& args) { HandleScope scope; Local<Function> callback = Local<Function>::Cast(args[0]); int status = uv_queue_work(uv_default_loop(), **something**, Work, After); assert(status == 0); return Undefined(); } }; 基本上我希望Work和After函数能够在类的data元素上工作。 但是,这似乎并没有工作。 我试过从types为void test::(*)(uv_work_t*)为void (*)(uv_work_t*)types指针。 但是,这似乎也没有工作。 你们可以给我一些关于如何解决这个问题的技巧吗?

node.js内部:如何找出'process.binding('eval')`被定义的位置?

我怎样才能find在node.js的C ++源代码中的JavaScript对象得到定义,我可以通过process.binding('eval') ? – 在这种特殊情况下,我已经发现它在/src/node_script.cc中,但是:我怎么才能知道在哪里可以find那个模块,只要看看/src/目录概览 ? 我不想浏览/src/中的所有文件以查找模块。 我在哪里可以find关于process.binding()的内部深入的信息? 谢谢。

获取Node.js事件循环中(活动)定时器的数量

有没有办法在Node.js中调用来确定事件循环队列中的定时器的数量? 我有一个有很多超时的图书馆,而不是使用某种内部簿记系统来跟踪他们,如果我可以问V8或Libuv或其他什么,有多less个定时器,那将是很好的。 这可能吗?

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

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

如何在nodejs插件中抽取窗口消息?

在一个Windows nodejs插件中,我创build了一个用于接收消息的窗口。 Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS … CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0); … } 我有一个wndproc函数。 Local<Function> wndProc; LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // pack up the arguments into Local<Value> argv wndProc->Call(Context::GetCurrent()->Global(), 3, argv); } 现在我需要抽取消息。 通常情况下,你会做类似的事情 MSG msg; […]

.pipe()是否在node.js中执行memcpy?

这是关于系统级优化的概念性查询。 通过阅读NodeJS文档,我的理解是pipe道很方便地在stream上执行stream量控制。 背景:我有麦克风stream,我想避免额外的复制操作,以节省整体系统MIPS。 据我所知,对于audiostream,即使有一个memcopy,但是我并没有花费大量的MIPS,但是我也有一个扩展计划,以30fps和UHD分辨率在相机帧中进行stream式处理。 以30fps制作UHD分辨率像素数据的多个副本是非常低效的,所以需要一些build议。 示例代码: var spawn = require('child_process').spawn var PassThrough = require('stream').PassThrough; var ps = null; //var audioStream = new PassThrough; //var infoStream = new PassThrough; var start = function() { if(ps == null) { ps = spawn('rec', ['-b', 16, '–endian', 'little', '-c', 1, '-r', 16000, '-e', 'signed-integer', '-t', 'raw', '-']); //ps.stdout.pipe(audioStream); //ps.stderr.pipe(infoStream); […]

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 […]

libuv线程安全吗?

我创build了一个专用于libuv运行循环的新线程。 线程函数看起来像这样: void thread_function() { uv_loop_t *loop = uv_loop_new(); uv_ref( loop ); uv_run( loop ); } 引用计数递增保持线程活着并处于处理libuv事件的状态。 我希望能够导致运行循环结束,从而导致线程退出,在主线程上执行uv_unref 。 但是,在检查uv_ref源代码时,我没有看到任何保证在并发访问期间对引用计数器variables的访问将被同步。 另外,在运行循环期间,我没有看到任何yield yield调用来放弃对操作系统的控制,这意味着该程序不会与其他进程合作。 这导致我相信我没有以正确的方式使用libuv。 如果有人能解释我做错了什么,那会很棒!

如何在Node.js中解释和执行asynchronousJavaScript?

最近我对Node.js的核心进行了大量的研究,并对Node平台的内部工作有一些疑问。 据我所知,Node.js是这样工作的: Node有一个使用Javascript编写的API,它允许程序员与文件系统和networking等进行交互。 但是,所有这些function实际上都是由C / C ++代码完成的,也是Node的一部分。 这是事情变得有点模糊的地方。 因此,Chrome V8引擎的工作基本上是将JavaScript编译成机器码。 V8是用C ++编写的,Javascript语言本身是由ECMA指定的,所以这些语言的关键字和特征等都是由它们定义的。 这导致我的第一个问题: 节点标准库如何能够与节点绑定进行交互,因为节点绑定是用C ++编写的? Chrome V8引擎如何在Node上下文中解释Javascript? 我知道它使用了一种叫做JIT的技术,在一个类似的问题中提到过:( https://softwareengineering.stackexchange.com/questions/291230/how-does-chrome-v8-work-and-why-was-javascript-但是这并不能解释Javascript是如何在Node上下文中解释的。 随同Node附带的Chrome V8引擎是否在Chrome浏览器上运行完全相同的引擎,还是已经修改为与Node一起使用? 这使我想到我的下一个问题。 所以Node提供了事件驱动的非阻塞IO。 它通过事件循环来完成这个事件,虽然它通常被称为“节点事件循环”,但它实际上是libuv库的一部分,libuv库是一个用来提供asynchronousIO的C ++库。 在高层次上,事件循环基本上是通过callback来访问的,这是一个原生的Javascript特性,也是Javascript被选为Node项目语言的原因之一。 以下是事件循环如何工作的示例: 这也可以通过这个整洁的小网站来演示: http : //latentflip.com/loupe/假设我们的Node应用程序需要调用外部API。 所以我们写这个: request(…, function eyeOfTheTiger() { console.log("Rising up to the challenge of our rival"); }); 我们的request调用被压入调用堆栈,并且我们的callback被传递到某个地方,直到请求操作结束。 当它发生时,callback被传递到callback队列中。 每次清除调用堆栈时,事件循环都会将callback队列顶部的项目压入调用堆栈,并在其中执行。 这个事件循环在一个线程上运行。 出现问题的时候是有人写'阻塞'的代码,或者从不离开调用堆栈的代码,并且有效地绑定线程。 如果总是有代码在调用堆栈上执行,那么事件循环将永远不会从callback队列中将项目推送到调用堆栈上,并且它们永远不会被执行,从而实质上冻结了应用程序。 这导致我到我的下一个问题: 如果JavaScript是由Chrome V8引擎解释的,而不是“控制”将代码推送到callback队列? Javascript代码如何由libuv事件循环处理? […]