• Future Pattern


    Future Pattern

    Started:

    看到MSDN的这篇文章【http://msdn.microsoft.com/zh-cn/library/dd764564.aspx#Y300】好像是今年2月份,快过年的样子。记得HM还特蛋疼的研究了一下lamada的汇编实现。当时看到Visual Studio 2010 实现的lamada非常的飘逸,对于future并没有太在意。贴一段飘逸的代码:

    async_future<int> max_value([&]() -> int {

    int largest = INT_MIN;

    for_each(values.begin(), values.end(), [&](int value) {

    if (value > largest)

    {

    largest = value;

    }

    });

    return largest;

    });

    最近翻看PoSA4时,又研究了一下future模式,对future有了新的理解。

    What:

    什么是future:future的原理是当你申请资源(计算资源或I/O资源)时,立即返回一个虚拟的资源句柄,当真正使用的时候,再将虚拟的句柄转化成真正的资源,相当于预获取。

    How:

    Future使用方法伪代码如下:

    Future::Future(Job_func):

    Thread.run(Job_func);

    end

    Future::get_result():

    While(result == NULL):

    Thread.sleep()

    Return result

    End

    Why:

    Future模式只有在并行运算的框架内才有意义。当一个逻辑操作设计的耗时操作比较多时,可以将耗时操作拆分成多个不太耗时的子操作,使子操作并行的执行,逻辑层依次获取子操作的结果。架设我们要执行一个逻辑操作,要求执行一次mysql查询,还要读一次文件,如果使用普通的同步方式:

    Do:

    query = Mysql_query()

    file = File_read()

    Do_thing(query, file)

    Done

    使用future模式示例如下:

    Do:

    Future a(Mysql_query)//! 非阻塞

    Future b(File_read) //! 非阻塞

    Query = a.get_result() //! 阻塞获取结果

    File = b.get_result() //! 阻塞获取结果

    Do_thing(query, file)

    Done

    这样sql查询和读取文件实现了并行运行,同步等待的时间为二者开销较大的运行时间。

    When:

    适于使用future模式的时机:在客户端,我们常常需要阻塞的获取结果,通过future模式可以大大提高响应速度。而在服务端程序,阻塞操作会降低系统的吞吐量,future模式试用的范围较窄,一般服务端采用异步回调的方式,将耗时的操作并行化,再通过回调方式将结果合并。Future构造时生成了虚拟的结果,如果使用这个结果越晚,当get_result时越不容易阻塞,所以从生成future到获取结果的间隔越长,future模式的功效越大。

    标签: future pattern c++

  • 相关阅读:
    Python的单向链表实现
    Leetcode 26.删除排序数组中的重复项 By Python
    Hdoj 1064 Financial Management
    【mui】
    jquery 五星评价(图片实现)
    jquery 实现点评标签 类似淘宝大众点评的 快速准时 货品完好等
    cmd命令安装、卸载、启动和停止Windows Service
    Jquery 上一步、下一步及提交
    Ajax 调用案例及错误捕捉
    【三】php 数组
  • 原文地址:https://www.cnblogs.com/cute/p/2700085.html
Copyright © 2020-2023  润新知