zoukankan      html  css  js  c++  java
  • 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 } ());
  • 相关阅读:
    python 获取当前路径
    python 执行结果输出为txt
    python def 定义函数
    python:浅析python 中__name__ = ‘__main__’ 的作用
    python 数组新增或删除元素
    python在Windows安装PIL的方法
    静态路由学习总结
    zookeeper客户端命令行操作
    kudu安装过程中可能出现的问题
    sudo: /etc/sudoers is world writable|给用户添加权限报错
  • 原文地址:https://www.cnblogs.com/kazetotori/p/6106068.html
Copyright © 2011-2022 走看看