4.3.0 延时事件机制改进

4.3.0之前的版本,swoole_event_defer方法底层的延时事件机制,存在一些问题。

  • Reactor::wait之前创建的defer任务,没有事件发生时无法触发,为了解决此问题,底层会在这种情况下,将延时任务转换为1ms的定时器
  • 在延时任务中添加延时任务,会在循环执行,而不是在下一次epoll_wait后执行
  • 延时任务无法阻挡Reactor退出,导致某些延时任务可能会丢失

新版本改进了延时任务机制,现在更安全,代码更简洁。

  • 有延时任务时,将epoll_wait的超时事件设置为0,即使没有任何事件触发,依然可以立即去执行延时任务,而不依赖定时器
  • 有延时任务时,Reactor必须要全部执行完成后才会退出
  • 在延时任务中添加延时任务,将会在下一次epoll_wait后执行