libuv
作者:互联网
介绍
libuv强制使用异步的,事件驱动的编程风格。它的核心工作是提供一个event-loop,还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具,例如定时器,非阻塞的网络支持,异步文件系统访问,子进程等。
event loop
在事件驱动编程中,程序会关注每一个事件,并且对每一个事件的发生做出反应。libuv会负责将来自操作系统的事件收集起来,或者监视其他来源的事件。这样,用户就可以注册回调函数,回调函数会在事件发生的时候被调用。event-loop会一直保持运行状态。
停止一个event loop!
uv_stop()用来终止event loop。loop会停止的最早时间点是在下次循环的时候,或者稍晚些的时候。
这也就意味着在本次循环中已经准备被处理的事件,依然会被处理。
uv_run()用来开始一个event loop。
stop_flag中止loop。现在所有的libuv回调函数都是在一次loop循环中被调用的,因此调用uv_stop并不能中止本次循环。
event loop 计数
event-loop在没有了活跃的handle之后,便会终止。整套系统的工作方式是:在handle增加时,event-loop的引用计数加1,在handle停止时,引用计数减少1。当然,libuv也允许手动地更改引用计数,通过使用:
void uv_ref(uv_handle_t*);
void uv_unref(uv_handle_t*);
libuv提供了什么?
1. processes
<win-unix/process.c>
libuv提供了相当多的子进程管理函数,并且是跨平台的,还允许使用stream,或者说pipe完成进程间通信。
在UNIX中有一个共识,就是进程只做一件事,并把它做好。因此,进程通常通过创建子进程来完成不同的任务(例如,在shell中使用pipe)。 一个多进程的,通过消息通信的模型,总比多线程的,共享内存的模型要容易理解得多。
2. Threads
<win-unixthread.c>
线程会在内部使用,用来在执行系统调用时伪造异步的假象。libuv通过线程还可以使得程序异步地执行一个阻塞的任务。方法就是大量地生成新线程,然后收集线程执行返回的结果。
当下有两个占主导地位的线程库:windows下的线程实现和POSIX的pthread。libuv的线程API与pthread的API在使用方法和语义上很接近。
最后要强调一句:只有一个主线程,主线程上只有一个event loop。不会有其他与主线程交互的线程了。(除非使用uv_async_send)。
3. Networking
在libuv中使用网络编程接口不会像在BSD上使用socket接口那么的麻烦,因为libuv上所有的都是非阻塞的,但是原理都是一样的
TCP
TCP是面向连接的,字节流协议,因此基于libuv的stream实现。
UDP
用户数据报协议(User Datagram Protocol)提供无连接的,不可靠的网络通信。因此,libuv不会提供一个stream实现的形式,而是提供了一个uv_udp_t句柄(接收端),和一个uv_udp_send_t句柄(发送端),还有相关的函数。也就是说,实际的读写api与正常的流读取类似。
Querying DNS
libuv提供了一个异步的DNS解决方案。它提供了自己的getaddrinfo。在回调函数中你可以像使用正常的socket操作一样。
Network interfaces
可以调用uv_interface_addresses获得系统的网络接口信息。
4. Filesystem
简单的文件读写是通过uv_fs_*函数族和与之相关的uv_fs_t结构体完成的
标签:handle,uv,event,线程,libuv,loop 来源: https://blog.csdn.net/u010682774/article/details/119893981