Node.js 节点NAN:在AsyncWorker的Execute方法中调用GetFromPersistent时获取设置错误

Node.js 节点NAN:在AsyncWorker的Execute方法中调用GetFromPersistent时获取设置错误,node.js,asynchronous,v8,node.js-addon,node.js-nan,Node.js,Asynchronous,V8,Node.js Addon,Node.js Nan,我正在为node构建一个本机扩展,其中包括一个长时间运行的操作,并在完成时进行回调 我正在向调用传递节点缓冲区。它包含扩展要处理的内容的有效负载 我应该能够将缓冲区存储在AsyncWorker的构造函数中的持久性存储中,并在以后需要时检索它 这个示例(来自nan测试套件)是我通常基于的代码: 这个测试是有效的,但是直到HandleOKCallback方法出现,它才对缓冲区做任何事情,这对我来说不是很有趣。我需要在Execute方法期间访问缓冲区 如果我只是在测试的Execute()方法中添加一行

我正在为node构建一个本机扩展,其中包括一个长时间运行的操作,并在完成时进行回调

我正在向调用传递节点缓冲区。它包含扩展要处理的内容的有效负载

我应该能够将缓冲区存储在AsyncWorker的构造函数中的持久性存储中,并在以后需要时检索它

这个示例(来自nan测试套件)是我通常基于的代码:

这个测试是有效的,但是直到HandleOKCallback方法出现,它才对缓冲区做任何事情,这对我来说不是很有趣。我需要在Execute方法期间访问缓冲区

如果我只是在测试的Execute()方法中添加一行来尝试访问缓冲区,如下所示:

void Execute () {
    printf("before GetFromPersistent\n");
    v8::Local<v8::Value> handle = GetFromPersistent("buffer");
    printf("after GetFromPersistent\n");
    printf("buffer @%llux len %ld\n", (uint64_t)node::Buffer::Data(handle), node::Buffer::Length(handle));
    Sleep(milliseconds);
}
void执行(){
printf(“在GetFromPersistent之前\n”);
v8::Local handle=GetFromPersistent(“缓冲区”);
printf(“在GetFromPersistent\n之后”);
printf(“buffer@%llux len%ld\n”,(uint64_t)节点::buffer::数据(句柄),节点::buffer::长度(句柄));
睡眠(毫秒);
}
我在GetFromPersistent调用中遇到seg错误

我的问题是:我错过了什么?我是否应该不能将持久对象拉入Execute方法?如果是,为什么不呢?

好的,我认为答案是“duh”,但对于刚刚开始使用节点本机扩展的其他人来说,我现在了解到的是:

由于节点是单个线程,长时间运行的任务若要不阻塞节点,必须在不同的线程中运行

Nan使用libuv来管理线程池,以执行您在“Execute”方法中编写的异步工作

然而,AsyncWorker的构造函数实际上在节点的线程上运行,并且HandleOKCallback也计划在执行完成后在那里运行

因此,在构造函数和回调设置中访问节点资源是可以的,但是由于Execute运行在不同的线程上,所以它不正常,所以它会区分错误

因此,对于我的问题(我在AsyncWorker中运行JPEG解码),我在构造函数中将指针和长度从缓冲区中拉出,但仍然在缓冲区上调用SaveToPersistent,以便在解码位时不会对其进行GCed