node c++多线程插件构想

最近想写一个node的c++插件实现线程。提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数。如果是node7.0以下的版本,函数必须返回一个promise对象

目前还在构想api列表,我本身并不懂c++,感觉和学过的c#相差太大,总之就是非常难的感觉,很多地方完全不能理解。按照网上的hello world写出来发现不对,在官网查结果api改了,那个气啊。

构想的api现在只有几个

Thread=require('thread');                      //引用

new Thread(fn[async],args);                  //创建一个线程

thr.id;                                                     //windows下thr的managedId

thr.start();                                              //启动线程,返回一个promise对象,可用await接收

thr.abort();                                             //中断线程,将触发promise的reject状态

thr.sleep(ms);                                         //阻塞线程,默认永久阻塞

thr.restart();                                           //重开阻塞的线程,如果没有阻塞,忽略此操作

thr.wait();                                               //当前线程等待该线程执行完毕

                                                               //用于不支持async/await的node版本

Thread.pool;                                           //获取线程池

pool.maxSize;                                         //get/set 线程池的最大尺寸

pool.minSize;                                          //get/set 线程池的最小尺寸

pool.workingCount;                                 //get 正在执行任务的工作线程数

pool.run(fn[async],args);                        //启动工作线程执行函数,返回promise

Thread.current;                                       //获取当前线程,允许在线程池里使用

                                                                //线程池里获取的线程不支持abort函数

Thread.lock(src);                                     //为资源上锁,同一时间只允许一个线程访问该资源

目前这只是一个构想,还没有实现,我在学习c++,最近因为考驾照比较忙,如果实现了,就可以如下使用代码。

const Thread = require(`thread`);
const threadPool = Thread.pool;

threadPool.run(async function (src) {
    try {
        let txt = require('fs').readFileSync(src)
        console.log(`结果为${result}`);
    }
    catch (err) {
        throw err;
    }
}, '1.txt');


//这里是一个死循环,在单线程的node里是绝对没有办法执行上面的console.log操作的
//但是这里使用多线程,使用子线程打印,主线程一直打印占用
while (true) {
    console.log(`主线程一直被占用`);
}

上面的例子还演示了fs.readFile可以写成如下

 1 const Thread = require(`thread`);
 2 const threadPool = Thread.pool;
 3 
 4 /**
 5  * @param {String} src 要读取的文件路径
 6  * @param {String} encode 编码
 7  * @return {Promise} 
 8  */
 9 // 这个函数虽然直接返回promise,但是由于理解方便,所有返回promise的函数都用async标记
10 async function readFile(...args) {
11     return threadPool.run(async () => {
12         try {
13             let result = require('fs').readFileSync(...args);
14             return result;
15         }
16         catch (err) {
17             throw err;
18         }
19     })
20 }
21 
22 /**
23  * 这个函数使用自带的fs.readFile改写成promise的形式
24  * 但还是上面的同步的方式看起来更舒服
25  */
26 async function readFile(src, encode) {
27     return new Promise((resolve, reject) => {
28         let args = [src];
29         if (encode) args.push(encode);
30         args.push((err, data) => {
31             if (err) reject(err);
32             else resolve(data);
33         })
34 
35         require('fs').readFile(...args);
36     })
37 }
38 
39 
40 //最终用async函数调用
41 (async function main() {
42     try {
43         let txt = await readFile('1.txt', 'utf-8');
44         console.log(txt);
45     }
46     catch (err) {
47         console.log(`出错啦,信息:${err.message}`);
48     }
49 } ());
原文地址:https://www.cnblogs.com/kazetotori/p/6106068.html