首页 > PHP资讯 > HTML5培训技术 > 用C++为nodejs写组件,提高node处理效率

用C++为nodejs写组件,提高node处理效率

HTML5培训技术
 昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。
 
首先,先来看看node 是如何和C++交互吧。
 
前提:需要安装nodejs 环境,安装node-gyp 包。采用npm 方式安装,这个太方便了,修改本文件夹下面的package.json 依赖选项,然后执行npm install 就可以了。
 
1.以hello world 为例来说明:
 
1)建立一个文件夹hello,在这个文件夹里依次添加3个文件,hello.cc, binding.gyp,test.js (其中hello.cc 是c++的源程序文件,binding.gyp 是编译模块的配置文件,这个文件被
 
node-gyp程序编译,test.js是nodejs的调用程序。)
 
文件下结构如下:
 
 
 
hello.cc 代码如下:
 
复制代码
#include
#include
 
using namespace v8;
 
Handle Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("hello,world"));
}
 
void init(Handle exports) {
  exports->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
 
NODE_MODULE(hello, init)
复制代码
binding.gyp如下:
 
复制代码
{
  "targets": [
    {
      "target_name": "hello",
      "sources": [ "hello.cc" ]
    }
  ]
}
复制代码
test.js 为:
 
var addon = require('./build/Release/hello');
 
console.log(addon.hello()); 
2) 直接执行 node-gyp configure build  就直接编译了。
 
3) 运行 node test.js 就输出结果。
 
好了,就这么简单。node就可以直接调用C++编写的程序。
 
对上面程序的解释:在hello.cc 中,我们首先创建了一个函数Method, 此函数返回一个"hello,world"的字符串,后面我们又创建了一个init的函数,作为一个初始化函数,我们去调用了一个函数
 
最后面,我们将这个模块绑定为:NODE_MODULE(hello, init)
 
在官网中指出,所有的node的插件必须输出一个初始化的函数,也就是说如下代码是在每个模块都必须有的,固定格式。
 
void Initialize (Handle exports);
NODE_MODULE(module_name, Initialize)
其中 module_name 必须对应上binding.gyp中的 target_name 就可以了。
 
经过了node-gyp configure build 编译以后会在当前文件下生成一个build 的新的文件夹。我们通过在test.js中去引用这个build的结果,就可以调用C++的写的程序了。
 
OK,一个简单的node与C++程序就写完了。
 
现在这样node就可以和C++写的程序交互了,直接去调用C++写的程序了。如果觉得node处理不过来,都可以通过C++来处理。
 
2.node 通过callback 回调的方式,调用C++处理后的结果返回给node
 
1)按照上面的方式,首先建立3个文件 callback.cc, binding.gyp,test.js
 
callback.cc:
 
复制代码
#define BUILDING_NODE_EXTENSION
#include
 
using namespace v8;
 
Handle RunCallback(const Arguments& args) {
  HandleScope scope;
 
  Local cb = Local::Cast(args[0]);
  const unsigned argc = 1;
  Local argv[argc] = { Local::New(String::New("hello world")) };
  cb->Call(Context::GetCurrent()->Global(), argc, argv);
 
  return scope.Close(Undefined());
}
 
void Init(Handle exports, Handle module) {
  module->Set(String::NewSymbol("exports"),
      FunctionTemplate::New(RunCallback)->GetFunction());
}
 
NODE_MODULE(callback, Init)
复制代码
binding.gyp:
 
复制代码
{
  "targets": [
    {
      "target_name": "callback",
      "sources": [ "callback.cc" ]
    }
  ]
}
复制代码
test.js:
 
var addon = require('./build/Release/callback');
 
addon(function(msg){
  console.log(msg); // 'hello world'
});
2)编译,在终端输入:node-gyp configure build ,会在当前目录下生成一个build 的新文件下
 
3)测试,node test.js  输出 //hello world
本文由欣才IT学院整理发布,未经许可,禁止转载。