节点NAN:在AsyncWorker的Execute方法中调用GetFromPersistent

我正在为节点构build一个本地扩展,其中包含一个完成时的callback函数。

我正在传递一个节点缓冲区到通话。 它包含要由扩展处理的内容的有效载荷。

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

这个例子(来自nantesting套件)是我通常基于我的代码: https : //github.com/nodejs/nan/blob/master/test/cpp/bufferworkerpersistent.cpp

这个testing是有效的,但是直到HandleOKCallback方法对缓冲区没有任何作用,这对我来说并不是很有趣。 我需要在Execute方法中访问缓冲区。

如果我只是在testing的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); } 

我在GetFromPersistent调用中遇到seg错误。

我的问题是:我错过了什么? 我应该不能将一个持久对象拖入Execute方法吗? 如果是这样,为什么不呢?

好的,我认为答案是“唔”,但是对于其他刚开始使用Node本地扩展的人来说,现在我正在理解的是:

由于节点是单个线程,因此长时间运行的任务必须在不同的线程中运行,否则不会阻塞节点。

Nan使用libuv来pipe理一个线程池来执行你在“Execute”方法中写入的asynchronous工作。

但是,AsyncWorker的构造函数实际上是在节点的线程上运行的,并且一旦执行完成,HandleOKCallback也会在那里运行。

因此,在构造函数和callback设置中访问节点资源是可以的,但是由于Execute在不同的线程上运行,所以它不是好的,所以它会出现seg错误。

所以对于我的问题(我在AsyncWorker中运行JPEG解码),我只是将指针和长度从构造函数中的缓冲区拉出来,但仍然调用缓冲区上的SaveToPersistent,以便它不会得到GCed, m解码比特。