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模式的功效越大。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员阿凯

Java面试通关要点汇总集 核心篇

964
来自专栏架构师小秘圈

你所不知道的库存超限做法

作者:程序诗人,来自:cnblogs.com/scy251147 零,题记 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达...

3206
来自专栏aCloudDeveloper

Linux探秘之I/O效率

一、文章来由   最近看了《UNIX环境高级编程》,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对...

2017
来自专栏Adamshuang 技术文章

Guava Cache -- Java 应用缓存神器

Guava 作为Google开源Java 库中的精品成员,在性能、功能上都十分出色,本文将从实际使用的角度,来对Guava进行讲解。

6497
来自专栏Java3y

多线程基础必要知识点!看了学习多线程事半功倍

1738
来自专栏ImportSource

分布式下的MS

MS模式是分布式系统中非常重要的一种复制模式,为了和配图协调,请允许这里直接使用了master-slave的缩写,没错,MS! 好,从现在开始,我们的标题变为:...

2514
来自专栏IT笔记

并发是个什么鬼之同步工具类CountDownLatch

扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过。就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用...

35510
来自专栏数据和云

深入并行:从数据倾斜到布隆过滤深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP...

2869
来自专栏吉浦迅科技

在cuda的核函数中可以按地址调用普通变量么?

请问在cuda的核函数中可以按地址调用普通变量么? GPU世界论坛 bbs.gpuworld.cn Hi, 楼主, 完全无问题,从Fermi起引入卡内统...

3437
来自专栏杨建荣的学习笔记

一个MySQL死锁问题的反思

很早之前我写过几篇关于MySQL死锁的分析,比如 换个角度看待MySQL死锁的一点简单认识 MySQL死锁的两个小案例 MySQL在RR隔离级别下的unique...

3398

扫码关注云+社区