Tag: libuv

节点插件使用libuv和uv_async_send – 节点进程不会退出

我有一个要求从一个节点插件调用一个Javascript函数。 插件将有一个连续运行的后台线程,所以它不是使用async_queue_work的经典asynchronous工作者需求。 我认为uv_async_send在这种情况下更合适。 我想在节点事件循环中放置一个函数,只要节点是空闲的就执行。 这个函数应该在主节点线程中运行。 要开始我有一个非常简单的插件,我正在试验uv_queue_work与uv_async_send 。 我可以同时工作,但在uv_async_send的情况下,节点进程永远不会退出。 node-uv.cc #include <node.h> #include <uv.h> using namespace v8; static void Runner(uv_work_t *req) { printf("Async work running!\n"); } static void RunDone(uv_work_t *req, int status) { delete req; printf("Async work done!\n"); } static void Runner2(uv_async_t* handle) { printf("Got async send!\n"); } void Start(const FunctionCallbackInfo<Value>& args) { printf("In run async\n"); […]

如何使用node-gyp根据节点版本有条件地编译node.js的本地代码?

我为node.js模块编写了一些C ++代码,这个模块是为节点0.8和增强的libuv编写的。 具体来说,我使用的是uv_mutex_ *函数,它不包含在节点0.6中包含的libuv中。 我想有条件地embedded这些函数的pthreads等价物,但是只有在旧版本的基础上构build。 如果节点版本为0.6,这应该使我在build立在节点0.8上的跨平台构build(Windows和Linux)和正常运行的Linux版本。 是否有节点版本的预处理器#define? 我找不到一个。 我能想到的最好的办法是在binding.gyp中做一些kludgy的东西来尝试猜测基于<@(node_root)的版本,并以某种方式将其按到“定义”值中。 一定会有更好的办法!

Nodejs进程locking从阻塞FUSE文件读取

我有一个nodejs webserver读取文件并提供内容。 其中一些文件是FUSE虚拟文件,这些文件在后台服务等待数据提供时可能会阻塞很长一段时间的读取。 看来,如果这些读取请求中的5个堆积起来,该过程将不再从任何文件读取。 此外,我不知道如何终止这些挂起的读取,如有必要。 这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的期望不一致?

nodejs使用libuv插件asynchronouscallback

我有一个节点js服务调用本地C库。 本土的图书馆,反复不断地发生火灾事件。 这些事件被传递给Ccallback函数。 我的目标是从这个本地Ccallback调用Javascriptcallback。 根据我的阅读,我使用uv_async_init和uv_async_send来实现这个目标。 我遇到的问题是我的本地Ccallback函数被调用了很多次,并且在那里uv_async_send被调用了很多次,但是传递给uv_async_init的函数只被调用了一次,只有当我的程序退出的时候。 这是我的C代码: ================================================== === #include "jsaudio.h" #include <iostream> using namespace v8; static void recordAudioCallback(int index); void asyncmsg(uv_async_t* handle); Callback* cbPeriodic; uv_async_t async; uv_loop_t* loop; NAN_METHOD(createEngine) { std::cout << "==> createEngine\n" ; } void createAudioRecorder(const Nan::FunctionCallbackInfo<v8::Value>& info) { std::cout << "==> createAudioRecorder\n"; } void startRecording(const Nan::FunctionCallbackInfo<v8::Value>& info) { std::cout << "==> […]

调用一些callback函数会导致分段错误:Nan

我正在用nbind编写C ++插件- GitHub链接用于大多数事情,而Nan-GitHub链接用于调用asynchronouscallback。 当我只调用callback一次,它的作品完美。 但是,当我调用callback两次,它给Segmentation fault (core dumped) 。 使用gdb找不到错误。 这里是JS和C ++代码(使用node-gyp configure build编译): //main.js code var nbind = require('nbind'); var lib = nbind.init().lib; lib.HeaderExample.callJS(function(a) { console.log("result" + a); }); lib.HeaderExample.startThread(); lib.HeaderExample.startThread(); C ++插件的代码 //c++ code class CallbackRunner : public Nan::AsyncWorker { public: CallbackRunner(Nan::Callback *callback) : AsyncWorker(callback) {} void Execute () {} void HandleOKCallback () […]

服务video文件时,node.js崩溃

我使用node.js和video.js插件提供静态video文件(.ogv和.mov)。 但是,node.js不断崩溃,出现以下错误消息: node: ../deps/uv/src/unix/stream.c:1319: uv_read_stop: Assertion `!uv__io_active(&stream->io_watcher, 4) || !(&stream->write_completed_queue == (&stream->write_completed_queue)->prev) || !(&stream->write_queue == (&stream->write_queue)->prev) || stream->shutdown_req != ((void *)0) || stream->connect_req != ((void *)0)' failed. 这是node.js代码: app.configure (function () { app.set ('views', path.join (__dirname, 'templates')); app.set ('view engine', 'jade'); app.use (express.favicon (path.join (__dirname, '/img/favicon.ico'))); app.use ('/video', express.static (path.join (__dirname, 'public'))); app.use (express.static (path.join […]

libuv:uv_check_t和uv_prepare_t用法

我一直在阅读libuv书 ,但检查和准备观察的部分是不完整的,所以我发现的唯一信息是在uv.h: / * * uv_prepare_t是uv_handle_t的子类。 * *每个活动的准备句柄在每个循环中只调用一次 *迭代,就在系统阻塞之前等待完成的I / O。 * / 和 / * * uv_check_t是uv_handle_t的子类。 * *每个活动的检查句柄在每个循环中调用一次 *迭代,在系统从阻塞返回之后。 * / 我想知道是否有任何libuv的检查和准备看守人的特殊用法。 我正在编写一个本地node.js绑定到一个c ++库,需要处理从不同线程触发的事件,所以自然,应该从主线程调用callback。 我尝试使用uv_async_t ,但是libuv不保证每一个uv_async_send调用一次callback,所以这对我不起作用。 这就是为什么我决定去我自己的线程安全的事件队列,我想定期检查。 所以我想知道是否使用支票或准备观察员可以为此目的。 实际上,我当前的解决scheme确实使用了uv_async_t监视器 – 每当我收到一个事件,我就把它放在队列中, 并调用uv_async_send – 所以当最后调用callback函数时,我会处理当前队列中的所有事件。 我对这种方法的担心是,许多事件可能实际上排队等待,直到callback被触发,同时可能失效(通过无效,我的意思是在这一点上处理它们变得毫无意义)。 所以我希望能够尽可能频繁地检查事件队列 – 观察者可以提供哪些检查/准备, 但是在每个事件循环迭代中,这样做可能是矫枉过正的(并且locking一个互斥锁)? 而且,更重要的是, 也许他们应该服务于更多的特殊用途,而不仅仅是确保一次循环迭代callback调用? 谢谢

在本地节点模块中,如何确保asynchronous代码始终在同一线程上运行?

我正在用C ++编写一个本地节点模块,它将成为一个C库的绑定。 该库中的一些对象只能由单个线程使用 。 这意味着,如果我使用uv_queue_work我不能确保它们只被同一个线程使用,因为 – 据我所知 – libuv使用线程池,我还没有能够找出如何告诉它什么线程用于这种工作。 这里有一些关于情况的想法,但是我不确定哪个是正确的方法。 简单地使所有的方法同步 – 这将不幸击败节点的目的和概念,所以我不想 创build一个自定义的线程,并执行我的代码 – 这将打败libuv的线程池的目的,并需要更多的工作 告诉libuv以某种方式执行相同的对象在其线程池中相同的线程的操作 – 我还没有find一种方法在文档中做这个 这种Node.js模块的推荐scheme是什么?

没有新的事件排队时,node.js应用程序如何继续运行?

我的问题是,即使没有新的事件存在,node.js应用程序如何像http服务器一样继续运行? 我认为当没有新的事件排队时,libuv事件循环终止。 事件监听器注册事件是不是有点像while(true){}循环? 这是我的问题的一个简单的代码示例: var http = require("http"); var server = http.createServer(function(request, response) { response.write("Hello World!"); response.end(); }); server.listen(8080); 谢谢 编辑:我们从libuv io循环文件知道循环必须在每个循环迭代的开始活着,这意味着更多的事件发生,因此更多的callback被注册执行。 在这个例子中,注册了一个事件监听器,但是在单个事件被处理之后程序退出,因为在下一次循环迭代之前没有更多的事件被触发。 var EventEmitter = require('events').EventEmitter; eventEmitter.on('event1', function() { console.log('event1 has occured'); }); eventEmitter.emit('event1'); 但是在这个例子中,程序由于激活的定时器而无限期地继续。 setTimeout(function() { console.log('setTimeout callback occured'); }, 2000); 那么在http服务器的例子中,循环是否保持活动状态(活动和ref'd句柄)呢?

如何存储对函数的引用,以便稍后在node.js C ++插件模块中调用它?

这里是我用C ++编写的node.js插件模块,使用node-gyp构build。 当StoreFunction我试图存储一个指向函数的指针,所以我可以稍后使用它 当我尝试稍后通过InvokeFunction调用它时,出现Segmentation错误。 如果我在两个函数(使用cout)中检查指针,我感到困惑,它们是相同的值。 所以我猜测调用两个函数之间调用上下文更改的变化,或者我不明白我指的是什么。 所有(ummmmmm)指针感激地收到我的问题在这里………….. #include <node.h> #include <v8.h> using namespace v8; v8::Persistent<v8::Function> callbackFunction; Handle<Value> StoreFunction(const Arguments& args) { HandleScope scope; callbackFunction = *Local<Function>::Cast(args[0]); return scope.Close(Undefined()); } Handle<Value> InvokeFunction(const Arguments& args) { HandleScope scope; Local<Value> argv[1] = { String::New("Callback from InvokeFunction")}; callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv); return scope.Close(Undefined()); } void init(Handle<Object> target) { NODE_SET_METHOD(target, "StoreFunction", […]