Tag: libuv

多次同时调用uv_write有时不起作用

我正在testing使用libuv开发的简单服务器体系结构。 每当服务器从客户端收到一些东西时,它就会通过'\ r'分割主体,并向所有观察者,每条消息进行广播。 然后,我用来testing的观察者使用相同的原始消息(回显服务器)调用server-> write()方法。 问题是,我每次运行程序,它随机工作或没有。 当它不起作用时,错误信息是: Assertion failed: (req->write_index < req->nbufs), function uv__write, file src/unix/stream.c, line 869. Abort trap: 6 完整的代码在这里: https : //github.com/ghostec/film 大部分的代码在这个文件中: https : //github.com/ghostec/film/blob/master/server/server.cpp 编辑:显然这是与uv_queue_work内的调用uv_write的事实有关。 由于它们都写入相同的处理程序,如果它们在libuv循环中调用时出现故障,则会发生不良情况。 但是,我不确定我的评估是否正确。

为什么libuv做多个线程的DNS请求

有时候我的服务一直发送大的差异主机名url,我会重新构build我的docker容器,容器同时重启,有些http请求会失败: events.js:154 throw er; // Unhandled 'error' event ^ Error: getaddrinfo ENOTFOUND www.videojj.com www.videojj.com:80 at errnoException (dns.js:26:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:77:26) 我不知道是什么原因,我知道DNS,由libuv中的multithreading文件操作。 我很困惑为什么DNS请求不能在libuv中使用IO多路复用机制

node.js / libuv如何使用reactor模式支持asynchronousio

libuv用于处理IO的反应器模式是通过devise同步的,但是libuv支持asynchronousIO。 这怎么可能? libuv是否扩展了反应堆的devise以支持asynchronousio? 使用multithreading/事件循环是否有助于实现这一点?

Node JS本地模块:你可以在独立的Libuv / NodeJS风格的过程中运行C / C ++方法吗?

这个有点奇怪 我写了一个大部分时间都运行良好的NodeJS本地模块,但是这个类包含一个在共享内存的上下文中运行的模块。 粗略地说,模块打开一个IO服务器,但有一个错误,需要我打开和closuresIO服务器来检索一个特定的值…当我执行此操作时,任何指针发现引用旧的IO服务器对象明显打破/ segfault(一个“涂鸦空间”的错误,对吧?)。 为了解决这个问题,我现在使用NodeJS的child_process.fork()在独立的上下文中运行错误的方法,并在主进程和分叉进程之间传递消息,让程序按需要运行(也就是我在里面调用方法分叉的进程,并使用'process.on(“message”,…)“来检索结果)。 这工作得很好,但感觉像一个非常昂贵的黑客… 为了logging,我尝试使用Libuv线程来运行该方法,但我遇到了同样的问题。 我猜这是因为函数调用仍然在共享内存中。 有没有办法让我用C ++在“NodeJS风格”过程中运行一小部分(或更多)C / C ++代码?

nodeJS中的uv和v8是什么?

在deps文件夹中有2个目录uv和v8 第一个问题:deps目录的定义是什么? 我的第二个问题:Node.js中的uv和v8工具是什么?

如何在本机C ++ / nodejs插件实现asynchronous构造函数/工厂调用?

我对C ++和node / v8 Addon开发相当陌生。 我试图包装第三方C库。 一些初始化函数运行时间很长,我想运行这些asynchronous操作(在libuv的帮助下)。 鉴于我有以下代码: #define BUILDING_NODE_EXTENSION #include <node.h> #include "myobject.h" //header files of 3rd party lib to be wrapped #include "3rdparty.h" using namespace v8; MyObject::MyObject(void* base) : baseobject_(base) {}; MyObject::~MyObject() {}; void MyObject::Init(Handle<Object> target) { // Prepare constructor template Local<FunctionTemplate> tpl = FunctionTemplate::New(New); tpl->SetClassName(String::NewSymbol("MyObject")); tpl->InstanceTemplate()->SetInternalFieldCount(1); Persistent<Function> constructor = Persistent<Function>::New(tpl->GetFunction()); target->Set(String::NewSymbol("MyObject"), constructor); […]

asynchronous构buildV8string数组

我正在构build一个节点模块来与libapt进行交互,以便列出和控制已安装的软件包。 我通过实现一个函数来获取每个已安装软件包的名称,从而开始简单。 我已经撞墙了。 我目前有这样的代码: #include <apt-pkg/init.h> #include <apt-pkg/cachefile.h> #include <apt-pkg/pkgcache.h> #include <node.h> #include <v8.h> using namespace v8; typedef struct AsyncData { Persistent<Function> callback; // callback function Handle<Array> packageList; // array of package names } AsyncData; void AsyncWork(uv_work_t *req) { AsyncData *asyncData = (AsyncData *)req->data; asyncData->packageList = Array::New(); size_t i = 0; for (pkgCache::PkgIterator package = […]

nodejs中的libuv线程如何利用多核CPU

我无法确定node.js中的libuv是使用多核心cpus还是仅使用时间片在单核上运行其所有线程? 由于node.js是单线程的,但libuv有它的oswn线程池,所以它使用多核心cpu的所有核心?

如何编写利用线程的Node.js代码?

所以这是我对节点如何工作的理解: 所有JS代码都在其中执行的单线程。 IO /networking调用在场景后面使用线程池。 (使用libuv这是一个C ++库) 一旦IO操作完成,它的callback被压入callback队列,并且callback可以被下一个滴答中的事件循环拾取。 我想了解的是如何编写可以利用系统线程的代码? 我在C / C ++中编写一个库,并提供一个JavaScript的绑定? 比方说,我有一些不需要IO但是CPU密集的操作/function,所以我想在多个线程中运行它。 我将如何做到这一点在节点?

在C ++插件中的Node.js / Nancallback中不常发生Segfault

我正在做一个NodeJS插件使用Nan库,我遇到了一个问题,调用一个callback(在JavaScript方面创build,并传递给插件以asynchronous执行)将导致段错误 – 但只有一次10万左右跑。 在所有事情的运作方面都有相当的复杂性,但我希望有人会看到我错过的东西,或者能够弄清楚发生了什么。 C ++callback函数是这样从javascriptcallback中创build的: auto nodeFunc = val.As<v8::Function>(); auto nodeCb = std::make_shared<Nan::Callback>(nodeFunc); auto callback = [nodeCb] (std::string err, std::string val) -> void { Nan::HandleScope scope; v8::Local<v8::Value> argv[2]; if (err.length() == 0) { auto isolate = v8::Isolate::GetCurrent(); auto json = v8::JSON::Parse(isolate, Nan::New(val).ToLocalChecked()); auto object = json.ToLocalChecked(); argv[0] = Nan::Null(); argv[1] = object; } else […]