libuv 补充
看了您提供的代码和libuv源码,我发现确实有一些教程中没有详细解释的重要概念。让我补充这些缺失的内容:
📚 需要补充的教程章节
章节 1:事件循环的详细执行流程
1.1 uv_run() 的完整执行过程分析
// 补充详细注释的 uv_run 实现
int uv_run(uv_loop_t* loop, uv_run_mode mode) {
int timeout;
int r;
int ran_pending;
// 1. 检查循环是否存活
r = uv__loop_alive(loop);
if (!r)
uv__update_time(loop); // 即使不存活也更新时间
// 2. 主循环:只要循环存活且未设置停止标志
while (r != 0 && loop->stop_flag == 0) {
// 阶段1:更新时间戳
uv__update_time(loop);
// 阶段2:执行定时器回调
uv__run_timers(loop);
// 阶段3:执行pending回调(返回是否执行了pending回调)
ran_pending = uv__run_pending(loop);
// 阶段4:执行idle回调
uv__run_idle(loop);
// 阶段5:执行prepare回调
uv__run_prepare(loop);
// 阶段6:计算I/O轮询超时时间
timeout = 0;
if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT)
timeout = uv_backend_timeout(loop);
// 阶段7:I/O轮询(可能阻塞)
uv__io_poll(loop, timeout);
// 阶段8:执行check回调(代码中未显示,实际存在)
uv__run_check(loop);
// 阶段9:执行close回调(代码中未显示,实际存在)
uv__run_closing_handles(loop);
// 重新检查循环是否存活
r = uv__loop_alive(loop);
// 特殊模式处理
if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT)
break;
}
return r;
}
1.2 各阶段详细说明
// 补充示例:演示每个阶段的执行顺序
#include <stdio.h>
#include <uv.h>
void timer_cb(uv_timer_t* handle) {
printf("↳ [Timer] Executed\n");
}
void pending_cb(uv_handle_t* handle) {
printf("↳ [Pending] Executed\n");
}
void idle_cb(uv_idle_t* handle) {
static int count = 0;
printf("↳ [Idle] Executed %d\n", ++count);
if (count >= 2) {
uv_idle_stop(handle);
printf(" ↳ [Idle] Stopped\n");
}
}
void prepare_cb(uv_prepare_t* handle) {
printf("↳ [Prepare] Executed\n");
}
void check_cb(uv_check_t* handle) {
printf("↳ [Check] Executed\n");
}
void close_cb(uv_handle_t* handle) {
printf("↳ [Close] Executed\n");
}
int main() {
uv_loop_t* loop = uv_default_loop();
printf("=== Libuv Event Loop Phase Demonstration ===\n");
// 1. 定时器
uv_timer_t timer;
uv_timer_init(loop, &timer);
uv_timer_start(&timer, timer_cb, 100, 0);
// 2. Pending回调(通过async模拟)
uv_async_t async;
uv_async_init(loop, &async, (uv_async_cb)pending_cb);
uv_async_send(&async);
// 3. Idle句柄
uv_idle_t idle;
uv_idle_init(loop, &idle);
uv_idle_start(&idle, idle_cb);
// 4. Prepare句柄
uv_prepare_t prepare;
uv_prepare_init(loop, &prepare);
uv_prepare_start(&prepare, prepare_cb);
// 5. Check句柄
uv_check_t check;
uv_check_init(loop, &check);
uv_check_start(&check, check_cb);
// 6. Close句柄(在循环结束后执行)
uv_timer_t timer_to_close;
uv_timer_init(loop, &timer_to_close);
uv_close((uv_handle_t*)&timer_to_close, close_cb);
printf("Starting event loop...\n");
uv_run(loop, UV_RUN_DEFAULT);
printf("Event loop finished\n");
return 0;
}
章节 2:uv__loop_alive() 的详细机制
2.1 循环存活判断逻辑
// 教程缺失:循环存活的具体判断标准
static int uv__loop_alive(const uv_loop_t* loop) {
return uv__has_active_handles(loop) || // 有活跃句柄
uv__has_active_reqs(loop) || // 有活跃请求
!uv__is_closing(loop); // 有关闭中的句柄
}
// 补充示例:演示不同情况下循环的存活状态
#include <stdio.h>
#include <uv.h>
void demonstrate_loop_alive() {
uv_loop_t loop;
uv_loop_init(&loop);
printf("1. Empty loop alive: %d\n", uv_loop_alive(&loop));
// 添加活跃句柄
uv_timer_t timer;
uv_timer_init(&loop, &timer);
printf("2. Loop with active handle alive: %d\n", uv_loop_alive(&loop));
// 启动定时器
uv_timer_start(&timer, NULL, 1000, 1000);
printf("3. Loop with started timer alive: %d\n", uv_loop_alive(&loop));
// 停止定时器
uv_timer_stop(&timer);
printf("4. Loop with stopped timer alive: %d\n", uv_loop_alive(&loop));
// 关闭句柄(进入关闭状态)
uv_close((uv_handle_t*)&timer, NULL);
printf("5. Loop with closing handle alive: %d\n", uv_loop_alive(&loop));
uv_loop_close(&loop);
}
章节 3:uv_backend_timeout() 的超时计算策略
3.1 超时计算的详细逻辑
// 教程缺失:I/O轮询超时的精确计算
int uv_backend_timeout(const uv_loop_t* loop) {
// 如果有活跃句柄或请求,不阻塞
if (loop->stop_flag != 0)
return 0;
if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop))
return 0;
// 计算最近定时器的时间
int timeout = 0;
if (!uv__is_closing(loop) &&
(loop->active_handles > 0 || !QUEUE_EMPTY(&loop->active_reqs)))
timeout = uv__next_timeout(loop);
return timeout;
}
// 补充示例:演示不同场景下的超时值
#include <stdio.h>
#include <uv.h>
void print_timeout_info(uv_loop_t* loop, const char* scenario) {
int timeout = uv_backend_timeout(loop);
printf("Scenario: %-20s | Timeout: %d ms\n", scenario, timeout);
}
void timeout_demo() {
uv_loop_t loop;
uv_loop_init(&loop);
print_timeout_info(&loop, "Empty loop");
// 添加idle句柄(立即执行,超时为0)
uv_idle_t idle;
uv_idle_init(&loop, &idle);
uv_idle_start(&idle, NULL);
print_timeout_info(&loop, "With idle handle");
// 添加定时器(有具体超时)
uv_timer_t timer;
uv_timer_init(&loop, &timer);
uv_timer_start(&timer, NULL, 5000, 0);
print_timeout_info(&loop, "With 5s timer");
// 设置停止标志
uv_stop(&loop);
print_timeout_info(&loop, "After uv_stop()");
uv_loop_close(&loop);
}
章节 4:ran_pending 变量的重要作用
4.1 pending回调的执行控制
// 教程缺失:ran_pending对UV_RUN_ONCE模式的影响
void demonstrate_pending_control() {
uv_loop_t* loop = uv_default_loop();
// UV_RUN_ONCE模式的行为:
// - 如果有pending回调:执行一次循环然后返回
// - 如果没有pending回调:等待I/O事件或超时
uv_async_t async;
uv_async_init(loop, &async, NULL);
printf("UV_RUN_ONCE behavior:\n");
// 情况1:没有pending回调
printf("1. No pending callbacks - will wait for I/O\n");
uv_run(loop, UV_RUN_ONCE); // 可能阻塞
// 情况2:有pending回调
uv_async_send(&async);
printf("2. Has pending callbacks - will execute immediately\n");
uv_run(loop, UV_RUN_ONCE); // 立即返回
// ran_pending的作用就是区分这两种情况
}
章节 5:完整的代码示例整合
5.1 综合演示所有概念
// advanced_loop_analysis.c
#include <stdio.h>
#include <uv.h>
void print_loop_state(uv_loop_t* loop, const char* phase) {
printf("\n--- %s ---\n", phase);
printf("Loop alive: %d\n", uv_loop_alive(loop));
printf("Stop flag: %d\n", loop->stop_flag);
printf("Backend timeout: %d ms\n", uv_backend_timeout(loop));
}
uv_timer_t timer1, timer2;
uv_idle_t idle;
uv_async_t async;
int async_sent = 0;
void timer1_cb(uv_timer_t* handle) {
printf("↳ Timer1 executed\n");
if (!async_sent) {
uv_async_send(&async);
async_sent = 1;
printf(" ↳ Async signal sent\n");
}
}
void timer2_cb(uv_timer_t* handle) {
static int count = 0;
printf("↳ Timer2 executed (%d)\n", ++count);
if (count >= 3) {
uv_stop(uv_default_loop());
printf(" ↳ uv_stop() called\n");
}
}
void async_cb(uv_async_t* handle) {
printf("↳ Async callback executed (was pending)\n");
}
void idle_cb(uv_idle_t* handle) {
static int count = 0;
printf("↳ Idle callback (%d)\n", ++count);
if (count >= 2) {
uv_idle_stop(handle);
printf(" ↳ Idle stopped\n");
}
}
int main() {
uv_loop_t* loop = uv_default_loop();
printf("=== Advanced Loop Analysis ===\n");
// 初始状态
print_loop_state(loop, "Initial");
// 设置各种句柄
uv_timer_init(loop, &timer1);
uv_timer_start(&timer1, timer1_cb, 100, 200);
uv_timer_init(loop, &timer2);
uv_timer_start(&timer2, timer2_cb, 500, 500);
uv_async_init(loop, &async, async_cb);
uv_idle_init(loop, &idle);
uv_idle_start(&idle, idle_cb);
print_loop_state(loop, "After setup");
// 模拟几次循环执行
for (int i = 1; i <= 5; i++) {
printf("\n>>> Loop iteration %d\n", i);
uv_run(loop, UV_RUN_ONCE);
if (loop->stop_flag) {
printf("Stop flag detected, breaking\n");
break;
}
}
print_loop_state(loop, "Final");
// 清理
uv_close((uv_handle_t*)&async, NULL);
uv_close((uv_handle_t*)&timer1, NULL);
uv_close((uv_handle_t*)&timer2, NULL);
// 执行关闭回调
uv_run(loop, UV_RUN_DEFAULT);
return 0;
}
📋 建议补充的完整章节大纲
新章节标题:"深入理解Libuv事件循环机制"
6.1 事件循环的完整生命周期
uv_run()的11个执行阶段详解- 各阶段回调的执行顺序和时机
6.2 循环控制机制
uv_stop()的实际工作原理- 停止标志对I/O轮询的影响
- 循环存活判断的精确条件
6.3 超时计算策略
uv_backend_timeout()的计算逻辑- 不同模式下的超时行为差异
- 优化I/O轮询性能的技巧
6.4 运行模式详解
UV_RUN_DEFAULTvsUV_RUN_ONCEvsUV_RUN_NOWAITran_pending变量的关键作用- 各种模式的实际应用场景
这些内容对于深入理解libuv的内部机制和性能优化至关重要,应该在教程中单独成章详细讲解。

浙公网安备 33010602011771号