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可以写成如下
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++多线程插件构想的更多相关文章
- node c++多线程插件 第二天 c++指针
虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...
- node c++多线程插件 第一天 c++线程相关函数
因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件 ...
- Node.js C++ 插件学习指南
Node.js插件(addons) Node.js 插件是用 C++ 编写的动态链接共享对象,可以使用 require() 函数加载到 Node.js 中,且像普通的 Node.js 模块一样被使用. ...
- 如何安装node.js支持插件
在eclipse插件中,node.js插件中比较知名的是nodeclipse. 从HBuilder6.3起,工具-插件安装,可直接选择nodeclipse插件安装.安装完毕后重启HBuilder新建n ...
- yum 多线程插件,apt多线程插件
1.安装yum-axelget插件,默认 yum使用单线程下载,安装该插件后,会使用多线程下载. yum -y install yum-axelget 2. apt-fast安装 https://gi ...
- Node.js 多线程完全指南
[原文] 很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争.考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉.要想知道原因,必须理解其单线程的真正含义. Jav ...
- node 后台管理插件forever
在一台计算机上手动跑Node项目简单,node xx.js就搞定了,想让Node项目后台运行,虽然不能直接用node命令搞定,但是在安装了forever这个包以后,还是很轻松的.不过要是在远程服务器上 ...
- Node热部署插件
一.supervisor 首先需要使用 npm 安装 supervisor(这里需要注意一点,supervisor必须安装到全局) $ npm install -g supervisor Linux ...
- 关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西
关于这个,我这几天一直在研究,国内关于v8的资料很少,stackoverflow上也不多. 说起来我得说声抱歉,虽然并没有承诺什么.这个功能大概是无法实现.下面我来解释一下为什么. 首先我们要了解一下 ...
随机推荐
- Android SVG矢量资源的使用方法
VectorDrawable 与 SVG Android 5.0(Lollipop, API 21)后,新增了<vector>标签,以VectorDrawable的形式支持SVG类型矢量图 ...
- com.atomikos.icatch.HeurHazardException: Heuristic Exception
com.atomikos.icatch.HeurHazardException: Heuristic Exception: 删除Tomcat bin文件夹下的spring.loglog4j.appe ...
- C# 结构体 枚举类型
注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...
- Express之get,pos请求参数的获取
Express的版本4.X Get query参数的获取 url假设:http://localhost:3000/users/zqzjs?name=zhaoqize&word=cool& ...
- GIS制图课程前言
一直以来都想写一本关于电子地图制图的工具书,把过去所遇到的关于电子地图制图的种种方法.技巧和问题进行总结和归纳,传播电子地图制图的思路和心得. 从2010年开始,陆陆续续在华南地区开展了多场的电子地图 ...
- Linux文件权限及用户管理
/etc/passwd文件与 /etc/shadow文件/etc/passwd文件/etc/passwd文件主要存放登录名.UID等用户相关信息,用户登录密码存放在/etc/shadow文件中.例子: ...
- Omi教程-组件通讯
组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 父容器设置 childrenData ...
- Linux系统(一)文件系统、压缩、打包操作总结
序言 当前的形势,.Net已经开源,.Net Core 正在跨平台,可见微软巨人在努力,在改变,在进步,在走向春天.从前被微软供作上帝的.Net从业者,如果不打开心扉面向开源,改变自己,那么很可能在不 ...
- BZOJ 2142: 礼物
模非素数下的排列组合,简直凶残 调着调着就过了= = 都不知道怎么过的= = 直接上链接http://hi.baidu.com/aekdycoin/blog/item/147620832b567eb4 ...
- WP8.1开发中关于媒体(图片)文件的生成操作,属性如何设置(内容/嵌入资源等);
(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题 链接:http://www.cnblogs.com/qinxg/archive/2012/07 ...