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 条评论
登录 后参与评论

相关文章

来自专栏数据和云

18C 也不能避免 SQL 解析的 Bug

作者简介 ? 苏星开 云和恩墨南区交付技术顾问,曾服务过通信、能源生产、金融等行业客户,擅长 SQL 审核和优化,DataGuard 容灾等。 1 概述 在 O...

31410
来自专栏小灰灰

Quick-Task 动态脚本支持框架之结构设计篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构...

983
来自专栏机器学习和数学

[编程经验]R语言入门及描述性统计分析方法

好吧,我承认,最近都没好好学习了,事情比较多,好几天晚上我都会写下标题,然后就没有然后了,今天再不能忍了,决定来一发。但是,我觉得还是推文的质量要比数量更加重要...

3945
来自专栏Crossin的编程教室

如何在 Python 中使用断点调试

实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。 -- 林纳斯·托瓦兹(Linux 之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被...

2836
来自专栏Java成长之路

java中的异步处理和Feature接口(一)

想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道。为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,...

1912
来自专栏日常学python

爬虫实践: 获取百度贴吧内容

本次要爬的贴吧是<< 西部世界 >>,西部世界是我一直很喜欢的一部美剧,平时有空也会去看看吧友们都在聊些什么。所以这次选取这个吧来作为实验材料。

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

如果理解Python web开发技术

首先来问一个问题,如何来看待Python web开发技术?如果不知道如何回答,我们换个问题:如何理解Python web的本质,这个我先用了三个程序来说明。 首...

3654
来自专栏安恒网络空间安全讲武堂

翻译 | python利用shodan搜集信息

文中提及的部分技术、工具可能带有一定的攻击性、仅供安全学习和教学用途,禁止非法使用! 安装 为了开始使用Shodan的Python库,首先要确保你已经收到了AP...

43410
来自专栏吴裕超

js和native交互方法浅析

一、背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路。 二、解决方案之WebViewJavascriptBridge  想要和a...

3168
来自专栏北京马哥教育

Linux性能检测常用的10个基本命令

本文的内容主要来自对Netflix的一篇技术博客( Linux Performance Analysis in 60,000 Milliseconds (htt...

1465

扫码关注云+社区