nodejs libuv学习

原创 2018年04月14日 23:34:33

读了一下libuv源代码,简单记录一些见解 https://github.com/libuv/libuv


libev就是一个基于epoll封装事件的函数库,自身不带有线程池等操作

而libuv则是在libev基础上,加上线程操作的功能,大体运作流程如下:
主线程负责利用epoll来监察事件的到来,但有事件过来,则把事件交到异步工作线程,然后注册一个文件描述符(epoll_wait就可以知道什么时候完成),等待异步线程完成工作
在异步工作线程,完成工作后,会通过pipe通知主线程,主线程则可以通过epoll_wait得知事件完成,然后执行callback函数

libuv实现了异步的文件操作和网络通信操作。对于异步的文件操作(读写),libuv是通过自身的线程池来新开线程服务文件操作请求(因为系统提供的文件操作api都是阻塞的)。
而对于网络操作(accept,read,write)等,则是利用了底层操作系统提供的非阻塞api。
libuv函数库使用起来较简单,因为libuv直接封装好 文件/网络 操作的 异步api,用户只需要往里面填写callback函数


libuv提供了封装好的api,使开发者不需要管理线程的情况下,完成异步编程。下面将简述几个重要的api

int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb)
loop 是事件队列,新注册的异步handle要往事件队列注册, async_cb是在主线程运行的任务(工作线程通过int uv_async_send()来通知)。

int uv_queue_work(uv_loop_t* loop,uv_work_t* req,uv_work_cb work_cb,
uv_after_work_cb after_work_cb) {

work_cb是在工作线程执行的任务,after_work_cb) 是工作线程结束之后,在主线程执行的任务


主线程和工作线程的通信是通过pipe来建立(int uv_async_send()封装了pipe的操作)。主线程在epoll注册了读的事件(pipe读的一端) 当工作线程往pipe写 (通过int uv_async_send()),
主线程就会收到通知(epoll_wait),然后执行async_cb)

工作线程是一开始就初始化的。libuv提供了线程池(threadpool.c), 默认初始化四个工作线程,然后等待执行任务。所以开发者可根据服务器的cpu数量来调节线程数


一个简单的线程池实现:

开一个数组来记录空闲的线程,开一个数组来记录在运行的线程,当线程执行完,从运行线程数组remove,然后添加到空闲线程数组
开一个优先队列来记录请求工作。主线程用一个for循环(结合线程的条件变量)来询问是否有空闲的线程。当有空闲线程,便从优先队列拿优先等级最高的请求工作,把它绑定到空闲线程然后执行,并把空闲线程转移到运行线程数组


学习libuv感悟

默默的学习,慢慢的修炼~
  • shiyongfu19890308
  • shiyongfu19890308
  • 2016-04-23 00:23:03
  • 1121

Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

http://www.cnblogs.com/chenyangyao/p/libuv_threadpool.html      声明:本文为原创博文,转载请注明出处。     ...
  • zdy0_2004
  • zdy0_2004
  • 2016-11-12 01:01:04
  • 675

使用libuv线程池实现Node.js异步函数

JavaScript是一种单线程的编程语言。在使用Node.js的时候,如果有耗时的操作,需要放到异步函数中。Node.js的底层使用了libuv,用于实现异步I/O。 学习资源 Node...
  • yushulx
  • yushulx
  • 2017-02-28 15:01:30
  • 952

libuv里的几个缺陷

libuv是node.js使用的基础库,主要包括主循环,文件和网络接口。虽然libuv是为node.js而生的,但它本身是一个独立的库,加上使用简单方便,所以在node.js之外也有不少人使用。最近整...
  • absurd
  • absurd
  • 2015-08-30 10:18:54
  • 23822

libuv 中文编程指南---文件系统

原文转自:http://www.cnblogs.com/haippy/archive/2013/03/15/2962219.html 简单的文件读写是通过 uv_fs_* 函数族和与之相关的...
  • hpp24
  • hpp24
  • 2016-11-21 12:19:24
  • 554

linux下nodejs依赖库libuv库,开发环境准备

nodejs底层使用libuv库实现异步IO,如果对nodejs的回调函数习以为常,而不知libuv,那岂不是很遗憾。libuv在github上托管了自己的源码,但是我要学习的是希望适用于nodejs...
  • limite_god
  • limite_god
  • 2015-02-06 14:55:53
  • 1192

libuv与libev的对比

libuv 和 libev ,两个名字相当相近的 I/O Library ,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述。 高性能网络编程这个...
  • monokeroslun
  • monokeroslun
  • 2014-07-03 16:35:04
  • 427

探究如何整合 GLib Main Event Loop 和 Node.js 的 libuv

这个作者写了许多glib的东西,值得借鉴,牛人呀 原文地址:http://iteches.com/archives/5259 在普通情况下,整合 GLib Main Event Loop 和 ...
  • yazhouren
  • yazhouren
  • 2014-03-17 17:37:39
  • 1443

libuv库学习笔记(1)

libuv库学习笔记(一) 文档翻译
  • paohui0134
  • paohui0134
  • 2016-06-11 15:14:44
  • 1207

libuv学习笔记(3)

libuv学习笔记(3) uv_handle_t结构体以及相关函数
  • paohui0134
  • paohui0134
  • 2016-06-11 17:10:53
  • 1555
收藏助手
不良信息举报
您举报文章:nodejs libuv学习
举报原因:
原因补充:

(最多只允许输入30个字)