callback模型与future模型的比较

这篇文章主要讨论callback与future两种异步模型的一些异同。

首先两者在概念上有一些相同的地方:
1.一个开始异步操作的初始函数。这个函数的参数提供了执行异步操作所需的必要信息。
2.一个后续函数(可调用对象),指定了异步操作完成时继续执行的代码。

对于callback模型,后续函数作为参数被传给初始函数。比如:

void async_listen(args, callback);

当异步操作结束后,其结果可以被传递给后续函数。

对于future模型,初始函数返回一个future对象给初始函数的调用者,调用者可以将后续函数与该future对象绑定。比如:

boost::future<int> f1 = async([]() { return 123; });
boost::future<string> f2 = f1.then([](future<int> f) { return f.get().to_string(); });

当future对象返回时,会调用与其boost::future::then成员绑定的lambda。如上所示,初始函数的调用者可以选择用future对象来进行后续的操作。
这种异步操作的调用和后续函数的绑定分离,有时是future模型的优点,但是有时它也会造成大量运行时间消耗。

从回调的底层过程上来说:
对于future模型,异步操作的执行和后续函数的设置是并行的,所以两者之间需要同步。
对于callback模型,由于后续函数作为形参传入初始函数后,才会调用异步操作,所以不需要额外的操作。
因此,当回调的数量多了以后,会耗费不少运行时间在同步工作上。

callback模型的优势在于:
1.更好的性能和较低的抽象代价。
2.Future、resumable function、coroutine等可以通过回调有效的实现。
3.没有与多线程组件绑定。

参考资料:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3964.pdf
https://www.boost.org/doc/libs/1_67_0/doc/html/thread/synchronization.html#thread.synchronization.futures

猜你喜欢

转载自blog.csdn.net/jshnaoko/article/details/80166603