1、说明
libuv 提供了一个线程池,可用于运行用户代码,libuv 中的工作队列中的任务会在线程池中执行
libuv 中的线程池在内部用于运行所有文件系统操作以及 getaddrinfo() 和 getnameinfo() 请求
libuv 中的线程池的默认数量为4,可以在启动时修改环境变量 UV_THREADPOOL_SIZE 来修改,最大值为 1024(1.30.0版本之前是128)
libuv 中的线程池是全局的,并在所有事件循环之间共享,当特定的函数利用 uv_queue_work() 方法使用工作队列时,libuv 会预分配线程池,以较小的内存开销(128个线程为1MB),来提高线程性能
以下三种类型的操作会在全局线程池中进行:
- 文件系统操作;
- DNS函数(getaddrinfo 和 getnameinfo);
- 使用 uv_queue_work() 调度的用户代码;
需要注意的是,即使使用了线程池,libuv 的方法也不是线程安全的
2、API
2.1、uv_queue_work
int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb);
添加一个任务到工作队列中,在主线程中调用
loop: 事件循环
req: 传入到任务的数据,一般使用 req.data 参数传递
work_cb: 执行方法
after_work_cb: