借助folly eventbase实现简单的异步周期回调

folly/io/async/EventBase.h 以libevent为基础,实现了强大的异步io网络库。这里只是简单的介绍一下如何使用EventBase实现简单的异步周期回调。

class MyPrinter
{
  int                                  n_;
  EventBase*                           pmanager;
  std::unique_ptr<folly::AsyncTimeout> ob_;

 public:
  MyPrinter(EventBase* manager, int n) : n_(n), pmanager(manager) { print(); }
  void print()
  {
    if (n_) {
      ob_ = AsyncTimeout::schedule(1s, *pmanager, [this]() noexcept {
        std::cout << "hello world" << std::endl;
        this->print();
      });
      --n_;
    }
  }
};

int main()
{
   EventBase manager;
   MyPrinter m(&manager, 5);
   manager.loop();
}

这里将每隔一秒打印一次”hello world”,共打印五次。print内的AsyncTimeOut::schedule用于发起异步操作,并且指定过期后要回调的函数对象,schedule的回调的lambda内又调用print本身。这样只要n_不为零,就会调用schedule。每次print都将要回调的计数n_减一。而main函数中的manage.loop用于检查当前 EventBase 是否有事件需要处理,如果有则处理,如果没有则退出。所以每次lambda被调用后,如果调用了schedule,manager.loop检查发现有事件需要处理,就会继续执行事件处理,而如果没有调用schedule,manager.loop检查发现没有事件需要处理,就会退出事件处理,程序结束。可以看到实现了我们的希望的异步周期回调功能。

Posted 2023-03-25