• libuv::线程池


    libuv提供了一个线程池,可用于运行用户代码并在循环线程中得到通知。该线程池在内部用于运行所有文件系统操作以及getaddrinfo和getnameinfo请求。
    其默认大小为4,但可以在启动时通过将UV_THREADPOOL_SIZE环境变量设置为任何值(绝对最大值为1024)来更改它 。
    线程池是全局的,并在所有事件循环之间共享。
    当特定的函数利用uv_queue_work()线程池时(即使用时),libuv预分配并初始化允许的最大线程数 UV_THREADPOOL_SIZE。
    这会导致相对较小的内存开销(128个线程约为1MB),但会在运行时提高线程性能。
    #include <cstdio>
    #include <stdio.h>
    #include <stdlib.h>
    #include <libuv/uv.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    long fib_(long t) {
        if (t == 0 || t == 1)
            return 1;
        else
            return fib_(t - 1) + fib_(t - 2);
    }
    
    void fib(uv_work_t* req) {
        int n = *(int*)req->data;
        if (random() % 2)
            sleep(1);
        else
            sleep(3);
        long fib = fib_(n);
        fprintf(stderr, "输入 %d 计算结果 %lu
    ", n, fib);
    }
    
    void after_fib(uv_work_t* req, int status) {
        fprintf(stderr, "输入 %d 已完成!
    ", *(int*)req->data);
    }
    
    int main() {
      //定义一个事件轮询
        uv_loop_t* loop = uv_default_loop();
        //将10个计算任务放入线程池中。
        int data[10];
        uv_work_t req[10];
        for (int i = 0; i < 10; i++) {
            data[i] = i;
            //传递任意参数
            req[i].data = (void*)&data[i];
           
            //libuv提供了线程池
            //但是只能同时执行4个(可以修改 UV_THREADPOOL_SIZE 环境变量设置)。
            //线程函数会在单独的线程中被启动, 并传入 uv_work_t 结构,
            //一旦函数返回, 就会调用 after_fib 函数, 同时也传入 uv_work_t 结构的指针.
            uv_queue_work(loop, &req[i], fib, after_fib);
        }
    
        return uv_run(loop, UV_RUN_DEFAULT);
    }
  • 相关阅读:
    表空间及组成表空间的物理文件
    MVCC
    innodb结构解析工具---innodb_ruby
    慢查询日志 与 general_log
    思考mysql内核之初级系列
    mysql内核源代码深度解析 缓冲池 buffer pool 整体概述
    change buffer
    python 学习笔记 copy
    xargs
    给tcpdump加点颜色看看
  • 原文地址:https://www.cnblogs.com/osbreak/p/14092431.html
Copyright © 2020-2023  润新知