最近想写一个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可以写成如下

 const Thread = require(`thread`);
const threadPool = Thread.pool; /**
* @param {String} src 要读取的文件路径
* @param {String} encode 编码
* @return {Promise}
*/
// 这个函数虽然直接返回promise,但是由于理解方便,所有返回promise的函数都用async标记
async function readFile(...args) {
return threadPool.run(async () => {
try {
let result = require('fs').readFileSync(...args);
return result;
}
catch (err) {
throw err;
}
})
} /**
* 这个函数使用自带的fs.readFile改写成promise的形式
* 但还是上面的同步的方式看起来更舒服
*/
async function readFile(src, encode) {
return new Promise((resolve, reject) => {
let args = [src];
if (encode) args.push(encode);
args.push((err, data) => {
if (err) reject(err);
else resolve(data);
}) require('fs').readFile(...args);
})
} //最终用async函数调用
(async function main() {
try {
let txt = await readFile('1.txt', 'utf-8');
console.log(txt);
}
catch (err) {
console.log(`出错啦,信息:${err.message}`);
}
} ());

node c++多线程插件构想的更多相关文章

  1. node c++多线程插件 第二天 c++指针

    虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...

  2. node c++多线程插件 第一天 c++线程相关函数

    因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件 ...

  3. Node.js C++ 插件学习指南

    Node.js插件(addons) Node.js 插件是用 C++ 编写的动态链接共享对象,可以使用 require() 函数加载到 Node.js 中,且像普通的 Node.js 模块一样被使用. ...

  4. 如何安装node.js支持插件

    在eclipse插件中,node.js插件中比较知名的是nodeclipse. 从HBuilder6.3起,工具-插件安装,可直接选择nodeclipse插件安装.安装完毕后重启HBuilder新建n ...

  5. yum 多线程插件,apt多线程插件

    1.安装yum-axelget插件,默认 yum使用单线程下载,安装该插件后,会使用多线程下载. yum -y install yum-axelget 2. apt-fast安装 https://gi ...

  6. Node.js 多线程完全指南

    [原文] 很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争.考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉.要想知道原因,必须理解其单线程的真正含义. Jav ...

  7. node 后台管理插件forever

    在一台计算机上手动跑Node项目简单,node xx.js就搞定了,想让Node项目后台运行,虽然不能直接用node命令搞定,但是在安装了forever这个包以后,还是很轻松的.不过要是在远程服务器上 ...

  8. Node热部署插件

    一.supervisor 首先需要使用 npm 安装 supervisor(这里需要注意一点,supervisor必须安装到全局) $ npm install -g supervisor Linux ...

  9. 关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西

    关于这个,我这几天一直在研究,国内关于v8的资料很少,stackoverflow上也不多. 说起来我得说声抱歉,虽然并没有承诺什么.这个功能大概是无法实现.下面我来解释一下为什么. 首先我们要了解一下 ...

随机推荐

  1. HDU-1864-最大报销额

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1864 这题开始题意没搞清楚,就做题了,导致浪费了很多的时间,不应该啊, 注意事项:每张发票上,单项物品 ...

  2. jq操作radio,设置选中、获取选中值

    <label><inputtype="radio"name="sex"value="1">男</label&g ...

  3. JavaScript 模拟策略模式

    /** * 模拟一个接口,其方法会抛出异常: */ function FlyInter () {} FlyInter.prototype.fly = function() { throw '实现这个接 ...

  4. c#中Partial关键字的作用

    1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在 ...

  5. NetStream.appendBytes, 走向Flash P2P VOD的第一步

    之前被告知可以自行实现Flash p2p的点播功能, 但一直疑惑, 印象中NetStream并未提供相关方法, 前天看订阅时发现的文章: ByteArray Access to NetStream i ...

  6. Flex移动应用程序开发的技巧和窍门(四)

    范例文件 flex-mobile-dev-tips-tricks-pt4.zip 这是本系列文章的第四部分,该系列文章涵盖Flex移动开发的秘诀与窍门. 第一部分关注切换视图以及切换执行应用时的数据处 ...

  7. react native ios打包到真机

    每当在模拟器上完成了开发,都想到真机上秀秀,正好前段时候买了一个mac,哈哈有机会了.前篇文章以android为例,这里就以ios为例,讲一下打包到iphone真机的流程. 一.前置 1.首先你得有一 ...

  8. this的相关介绍与用法

    当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并 ...

  9. mybatis 关于时间的问题与技巧

    oracle:     此执行是在oracle下! 关于日期和时间的问题,date只有日期   timestamp 带有时分秒 一  #号取值     1.date         insert in ...

  10. MegCup 2017 极客挑战赛 初赛试题

    看着像八卦,数数不是八卦,是29卦 每卦又有29个小弧 所以是29×29个bit 这29×29个bit怎么理解呢?并且从哪一卦开始到哪一卦结束?是先环向层层向里走还是先径向逐卦走? 我想不出来. 我猜 ...