process.binding('eval')
?- 我已经发现它是在/src/node_script.cc
这个特殊情况下,但是:当我只是看一下目录概述时,我怎么知道在哪里可以找到该模块?我不想单步执行所有文件以查找模块./src/
/src/
process.binding()
s 内部的一些深入信息?谢谢.
我一直在阅读libuv书,但是关于检查和准备观察者的部分是不完整的,所以我发现的唯一信息是在uv.h中:
/* * uv_prepare_t is a subclass of uv_handle_t. * * Every active prepare handle gets its callback called exactly once per loop * iteration, just before the system blocks to wait for completed i/o. */
和
/* * uv_check_t is a subclass of uv_handle_t. * * Every active check handle gets its callback called exactly once per loop * iteration, just after the system returns from blocking. */
我想知道libuv的检查和准备观察者是否有任何特殊用法.
我正在编写一个本机node.js绑定到需要处理从不同线程触发的事件的c ++库,所以自然地,应该从主线程调用回调.我尝试过使用uv_async_t
,但是libuv并不能保证每次都会调用一次回调,uv_async_send
所以这对我不起作用.
这就是为什么我决定使用自己的线程安全事件队列,我想定期检查.所以我想知道使用支票或准备观察者是否可以用于此目的.
实际上,我当前的解决方案确实使用了一个 …
这是一个node.js插件模块,我用C++编写,使用node-gyp构建.当StoreFunction我试图存储一个指向函数的指针,以便我以后可以使用它
当我稍后尝试在InvokeFunction中调用它时,我得到一个Segmentation错误.如果我检查两个函数中的指针(使用cout)它们是相同的值,那令我困惑的是什么.
所以我猜测调用两个函数之间调用上下文的变化或者我不明白我指向的是什么.
所有(ummmmmm)指针在这里感谢我的问题..............
Run Code Online (Sandbox Code Playgroud)#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", StoreFunction); NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction); } NODE_MODULE(someaddonmodule, init);
当然还有一些叫js ...........
var myaddon = require('../build/Release/someaddonmodule');
myaddon.StoreFunction(function(data){
console.log("Called back: "+data);
});
myaddon.InvokeFunction(); //causes a segmentation fault
Run Code Online (Sandbox Code Playgroud) 例如,我有2个线程.我想从主线程(线程1)停止服务器.
主题1:主程序
线程2:TcpServer
来自libuv库:
/*
* This function will stop the event loop by forcing uv_run to end
* as soon as possible, but not sooner than the next loop iteration.
* If this function was called before blocking for i/o, the loop won't
* block for i/o on this iteration.
*/
UV_EXTERN void uv_stop(uv_loop_t*);
Run Code Online (Sandbox Code Playgroud)
这意味着,如果我uv_stop(tcp_server_loop)
在主线程中调用并且由于tcpserver上没有事件而阻塞服务器循环,那么服务器将仍然处于循环中直到出现某个事件.(它可能会检查是否uv_stop
在循环进入阻止模式之前调用以等待新事件).
我正在尝试使用 libuv 作为事件库来编译hiredis (C++) 附带的示例程序。Redis 的 Windows 兼容版本使用名为 Win32_Interop 的库。
我遇到了两个问题:
libuv 和 Win32_Interop 都定义了 ssize_t,但它们是相互冲突的类型。
libuv 和 Win32_interop 都使用 WinSocks。将程序链接到 ws2_32.lib 会导致重复定义,而不这样做会导致无法解析的外部符号。
我该如何解决这些问题?
我已经对此效果进行了一些研究,但目前还不清楚是否可以在IOS/Android上使用libuv?如果它不可能是什么限制它?
我正在寻找一个C++库,我可以在IOS,Android,Windows,OSX和Linux上使用相同的应用程序.Libuv似乎接近满足套接字和线程的所有要求.
我正在使用libuv进行广泛的网络交互应用程序,我担心重新使用已分配内存的哪些技术可以同时使用libuv回调执行的高效和安全.
在非常基本的层,暴露给libuv用户,需要在设置句柄阅读器的同时指定缓冲区分配回调:
UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb);
Run Code Online (Sandbox Code Playgroud)
这里uv_alloc_cb
是
typedef void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
Run Code Online (Sandbox Code Playgroud)
但问题是:每次通过句柄传递新消息时调用此内存分配回调(例如,uv_udp_t
接收到来自句柄的每个UDP数据报),并且每个传入UDP数据报的新缓冲区的直接前向分配似乎非常非内存-明智的.
所以我要求在可能的情况下重新使用相同的分配内存的常见C技术(可能在libuv回调系统引入的延迟执行上下文中).
另外,如果可能的话,我想保持便携式窗户.
笔记:
阅读http://nikhilm.github.io/uvbook/filesystem.html,我注意到了以下短语uvtee/main.c - Write to pipe
:
我们制作一个副本,这样我们就可以从两次调用中释放两个缓冲区,使它们彼此独立.虽然这样的演示程序可以接受,但您可能需要更智能的内存管理,例如引用计数缓冲区或任何主要应用程序中的缓冲池.
但我无法找到任何涉及libuv缓冲区上的引用计数的解决方案(如何正确执行?)或libuv环境中缓冲池的显式示例(是否有任何库?).
我无法确定node.js中的libuv是使用多核cpus还是仅使用时间切片在单核上运行其所有线程?由于node.js是单线程的,但libuv有自己的线程池,所以它是否使用多核cpu的所有内核?
当libfaketime
用于更改进程的时间速度时,超时设置将setTimout
根据在Linux下运行时更改的时间到期,但根据在Mac OS下运行时的原始系统时间.
在Mac OS中:
DYLD_INSERT_LIBRARIES=src/libfaketime.1.dylib DYLD_FORCE_FLAT_NAMESPACE=y FAKETIME="@2020-12-24 00:00:00 x3600" node
> setTimeout(() => {console.log('hello');}, 3600 * 1000); // Takes an hour
Run Code Online (Sandbox Code Playgroud)
在Linux中:
LD_PRELOAD=src/libfaketime.1.so FAKETIME="@2020-12-24 00:00:00 x3600" node
> setTimeout(() => {console.log('hello');}, 3600 * 1000); // Takes a second
Run Code Online (Sandbox Code Playgroud)
在调查这个问题,我注意到libc
的clock_gettime
功能是由Node.js的(libuv?)Linux下接受调查,但在Mac OS上运行时,不调用该函数.(我printf
在libfaketime
函数中添加了一些内容)
node.js(libuv?)的实现有什么不同,导致Mac OS和Linux之间的行为差异?为什么存在这种差异?
我做的另一个观察是,使用Linux libfaketime
的行为冻结时间setImmediate
并且setTimeout(cb, 0)
在Linux下的不同之处在于回调是在使用setImmediate
时运行而不是在使用时运行setTimeout(cb, 0)
.
我试图了解nodeJS中的线程池。通过创建运行代码process.env.UV_THREADPOOL_SIZE = 5;
process.env.UV_THREADPOOL_SIZE = 5;
const https = require('https');
const crypto = require('crypto');
const fs = require('fs');
const start = Date.now()
function doRequest() {
https.request('https://google.com', res => {
res.on('data', () => {});
res.on('end', () => {
console.log('Request:', Date.now() - start)
})
})
.end()
}
function doHash(){
crypto.pbkdf2("a", "b", 100000, 512, 'sha512', () => {
console.log("Hash:", Date.now() - start);
})
}
doRequest();
fs.readFile('multitask.js', 'utf8', () => {
console.log('fs:', Date.now() - start)
});
doHash();
doHash();
doHash();
doHash();
Run Code Online (Sandbox Code Playgroud)
我在终端中得到输出: