Events 事件循环如何从网络I/O中取消阻止自身?

Events 事件循环如何从网络I/O中取消阻止自身?,events,libuv,Events,Libuv,libuv有一个中心事件循环,并允许异步网络I/O、定时器等 文档中呈现的高级架构是: 当事件循环阻塞“就绪”套接字(使用epoll等)时,如果没有任何套接字就绪,它如何解除自身阻塞?它可能会错过一些计时器,而这些计时器可能会在这段时间内用完 如果在没有套接字为空且没有计时器可触发的情况下立即取消阻止,事件循环是否会退化为“忙等待”套接字准备就绪?uv\u run通过向轮询函数传递额外的超时参数来确保不忙等待。在windows上,计算轮询调用超时的实现基本上如下所示 int uv__next_

libuv有一个中心事件循环,并允许异步网络I/O、定时器等

文档中呈现的高级架构是:

当事件循环阻塞“就绪”套接字(使用epoll等)时,如果没有任何套接字就绪,它如何解除自身阻塞?它可能会错过一些计时器,而这些计时器可能会在这段时间内用完


如果在没有套接字为空且没有计时器可触发的情况下立即取消阻止,事件循环是否会退化为“忙等待”套接字准备就绪?

uv\u run
通过向轮询函数传递额外的超时参数来确保不忙等待。在windows上,计算轮询调用超时的实现基本上如下所示

int uv__next_timeout(const uv_loop_t* loop) {
  const struct heap_node* heap_node;
  const uv_timer_t* handle;
  uint64_t diff;

  /* If not timer block indefinitely */
  heap_node = heap_min(timer_heap(loop));
  if (heap_node == NULL)
    return -1;

  /* Timer should have fired already */
  handle = container_of(heap_node, uv_timer_t, heap_node);
  if (handle->timeout <= loop->time)
    return 0;

  /* Timer fires in the future, compute the timeout until the 
     next timer should fire */
  diff = handle->timeout - loop->time;
  if (diff > INT_MAX)
    diff = INT_MAX;

  return (int) diff;
}
int uv\u next\u超时(const uv\u loop\u t*loop){
常量结构堆节点*堆节点;
常量uv定时器*句柄;
uint64_t diff;
/*如果不是,计时器将无限期阻塞*/
heap_node=heap_min(计时器_堆(循环));
if(heap_node==NULL)
返回-1;
/*计时器应该已经启动了*/
句柄=容器(堆节点、uv定时器、堆节点);
如果(句柄->超时时间)
返回0;
/*计时器在将来触发,计算超时直到
下一个计时器应该启动*/
diff=句柄->超时-循环->时间;
如果(差异>整数最大值)
diff=INT_MAX;
返回(int)diff;
}

只有在没有可用计时器的情况下,循环才会阻塞,直到套接字/IO完成端口准备好使用为止,否则它最多会阻塞一段时间,直到触发下一个超时。
heap\u min
确保始终返回下一个计时器,以确保不会错过任何计时器。

uv\u run
通过向轮询函数传递额外的超时参数来确保不忙等待。在windows上,计算轮询调用超时的实现基本上如下所示

int uv__next_timeout(const uv_loop_t* loop) {
  const struct heap_node* heap_node;
  const uv_timer_t* handle;
  uint64_t diff;

  /* If not timer block indefinitely */
  heap_node = heap_min(timer_heap(loop));
  if (heap_node == NULL)
    return -1;

  /* Timer should have fired already */
  handle = container_of(heap_node, uv_timer_t, heap_node);
  if (handle->timeout <= loop->time)
    return 0;

  /* Timer fires in the future, compute the timeout until the 
     next timer should fire */
  diff = handle->timeout - loop->time;
  if (diff > INT_MAX)
    diff = INT_MAX;

  return (int) diff;
}
int uv\u next\u超时(const uv\u loop\u t*loop){
常量结构堆节点*堆节点;
常量uv定时器*句柄;
uint64_t diff;
/*如果不是,计时器将无限期阻塞*/
heap_node=heap_min(计时器_堆(循环));
if(heap_node==NULL)
返回-1;
/*计时器应该已经启动了*/
句柄=容器(堆节点、uv定时器、堆节点);
如果(句柄->超时时间)
返回0;
/*计时器在将来触发,计算超时直到
下一个计时器应该启动*/
diff=句柄->超时-循环->时间;
如果(差异>整数最大值)
diff=INT_MAX;
返回(int)diff;
}
只有在没有可用计时器的情况下,循环才会阻塞,直到套接字/IO完成端口准备好使用为止,否则它最多会阻塞一段时间,直到触发下一个超时。
heap_min
确保始终返回下一个计时器,以避免错过任何计时器