其他分享
首页 > 其他分享> > libuv

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