演出季上“异步编程模型的演变”幻灯片

标签: .Net框架 语言编程 前端表现 并行处理 培训演讲 | 发表时间:2010-12-13 15:16 | 作者:[email protected] (老赵) 王雪松
出处:http://blog.zhaojie.me/

演出季终于过去了,现在就来做一个收尾吧。这次的主题是“异步编程模型的演变”,主要回顾了微软在.NET平台上异步编程上的进化:基于回调,基于迭代生成器,基于类库,基于语言。不过这样的编程模型其实并非微软独有,而是一些运用比较广泛的异步编程方式,因此在SD 2.0大会上我其实完全用JavaScript进行演示。从结果上来看,除了最早的TUP,其他两场演讲(.NET技术大会SD 2.0)的反响都不错。

严格说来,这场演讲在过去一个月中讲了四次,其中第一次是在CSDN举办的TUP活动上。您可能注意到“异步编程”是我后半年关注的重点,例如在创新院赞助的nBazaar交流会上我分享的话题都是关于异步编程的,这次要在1小时内覆盖之前两场演讲,自然信息量很大。于是在TUP活动上的演讲便不太理想,因为内容实在太多,结果绝大部分内容几乎都是匆匆扫过。不幸中的万幸,这次演讲的幻灯片倒成了一个“阅读材料”(下载)。

我将异步编程模型的演变过程分为四个部分:

  • 基于回调:这是最传统的异步编程模型,“回调”是“异步”的天然属性,例如.NET里的Begin/End异步模型或是基于事件的异步模型。在前端开发中,XMLHttpRequest或是DOM事件,事实上都是基于事件的异步编程模型。这种编程模型破坏了代码的局部性,写起来非常麻烦,更别说是异步操作的组合、异常处理、取消等操作了。
  • 基于迭代生成器:我把这个单独提出来说,是因为迭代生成器几乎已经成为现代语言的标配了,在JavaScript 1.7里也有相应的特性——自然,可怜的Java语言是不曾提供支持的。有了迭代生成器,我们就可以在发起异步操作的时候,将控制权交给外部,由外部来决定代码什么时候继续执行,这就在一定程度上保持了代码的局部性。
  • 基于类库:由于异步编程十分困难,有时候语言层面的支持有限,聪明的程序员们想尽了各种办法来简化异步编程。其中主要的办法就是总结出一种异步模型,并围绕这种模型提供一种异步类库。其中的典型便是“推集合模型”以及“响应式编程”。只可惜想要基于死板的Java语言开发出好用的异步类库也总是使不出劲,与它形成鲜明对比的便是Scala语言,基于同样的平台,生产力却天下地下。
  • 基于语言:有时候,语言设计者会直接在语言层面上简化异步编程的问题,其中的典型便是Erlang语言以及下个版本的C#。不过这里我主要讨论的是F#语言里的异步工作流。不过严格来说,F#的异步工作流是个类库,它使用了F#的“计算表达式”特性,这才是个语言特性。我参考了F#的异步工作流,开发Jscex(一个JavaScript至JavaScript编译器)以及Jscex.Async组件(基于Jscex的异步类库)。

由于TUP上的失策,我为一个星期后的.NET技术大会上重新组织了内容,减少了“代码赏析”的数量,增加了演示用的示例。我的演示是在Mac OS上基于Mono 2.8和MonoMac编写的带有Mac OS原生界面的应用程序,以此体现异步编程对于各平台上UI编程的重要性。有了TUP的经验,这次的演讲反响不错,我也被评为这次会议Top 5讲师。幻灯片如下(下载):

我为SD 2.0大会使用JavaScript重新编写了所有的示例,并在创新院内部的分享交流会上进行了试讲。试讲的反馈是“干货太多”,这使得我重新提炼了一下示例。不过在大会的前一天,我还是补充了一个基于node.js开发的最简单的静态文件服务器,以此表示Jscex并非只能在浏览器里使用。幻灯片如下(下载):

有趣的是,在我之前的一场演讲接近尾声的时候,会场里大约只坐了一半人,因此我一开始还担心没人来听。幸运的是在演讲开始时位子已经基本坐满了,后来还有一些人站在一旁。演讲之后的反馈很少,不过都是正面的。会后我还和业界的一些JavaScript大牛交流了一下Jscex,这也是我接下来一段时间的一个工作重点,希望能够做大做好。

这个演出季已经过去了,接下来又到了nBazaar交流会的时间了。第三届交流会将在1月15日举行,具体消息将在不久之后公开,敬请关注。我们又准备了四场有价值的演讲,一定能让您满意。

相关 [演出 异步 编程] 推荐:

演出季上“异步编程模型的演变”幻灯片

- 王雪松 - 老赵点滴 - 追求编程之美
演出季终于过去了,现在就来做一个收尾吧. 这次的主题是“异步编程模型的演变”,主要回顾了微软在.NET平台上异步编程上的进化:基于回调,基于迭代生成器,基于类库,基于语言. 不过这样的编程模型其实并非微软独有,而是一些运用比较广泛的异步编程方式,因此在SD 2.0大会上我其实完全用JavaScript进行演示.

受禁锢的异步编程思维

- - 老赵点滴 - 追求编程之美
最近一直在努力推广 Jscex,补充了很多中文文档和示例,因此博客上都已经有两篇文章有了“上”而没有“下”,即使最复杂的图示也已经绘制完毕. 在推广Jscex的过程中,我发现有个比较明显的问题是,许多使用JavaScript的程序员已经习惯旧有的编程方式,甚至推崇一些据他们说很“漂亮”的模式. 但在我看来,这其实跟许多GoF模式是在修补OO语言的不足有些类似,很多异步模式都只是因为JavaScript语言特性不足而设计出来的“权宜之计”.

Javascript异步编程的4种方法

- - 阮一峰的网络日志
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务. 如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.

异步编程语言的常见坑

- - idea's blog
天生支持异步编程的语言如 NodeJS, Golang 等, 创建一个异步 routine 的成本非常小, 这确实是一个非常方便的功能. 比如用在网络爬虫程序的开发, 对于每一个要抓取的 URL 就启动一个 routine, 类似启动一个线程, 既能充分利用 CPU 多核, 代码也很简洁.. 正因为太方便, 所以常常被滥用, 并引发许多严重坑.

Java 异步编程最佳实践

- - 鸟窝
最近异步编程非常流行, 主要是它能够在多核系统上提高吞吐率. 异步编程是一种编程方式,可以提高对UI的快速响应. Java中的异步编程模型提供了一致性的编程模型, 可以用来在程序中支持异步. 本文讨论了在使用Java执行异步操作应该遵循的最佳实践. 原文: Best Practices of Asynchronous Programming With Java.

异步编程 In .NET - 腾飞(Jesse) - 博客园

- -
async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试. 今天我们再来回答一下这个问题,同时我们会做一个async和await在WinForm中的尝试,并且对比在4.5之前的异步编程模式APM/EAP和async/await的区别,最后我们还会探讨在不同线程之间交互的问题.

如何优雅地实现"异步"编程?

- - 掘金 架构
Java异步编程极大的节省了主程序执行时间,提升了计算资源利用效率,是Java高级工程师的必备技能之一. 本文围绕什么是异步,异步解决了什么问题,怎么 异步编程来展开. 在解释异步编程之前,我们先来看 同步编程的定义. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后,需等待其响应返回,然后执行后续代码.

从事件驱动到observable的异步编程——PubSub+Promise+Rx的JS事件库

- Kejun - YY in Limbo 混沌海狂想
你上当叻,虽然从外面看标题很有气势,传达出一种宏大叙事的赶脚,其实我只是刚刚把一个阿尔法城的JS模块提交到github,想顺便介绍一下,但我连API文档都懒得写,就别指望能深入浅出的讲一遍来龙去脉了⋯⋯. 所以就直接帖几个前置阅读的链接罢. 这些潮流的外部起源:(技术也有外源论/exogenesis⋯⋯).

linux异步IO浅析

- Sepher - kouu's home
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上. 预先知道这些数据的位置,所以预先发起异步IO读请求. 等到真正需要用到这些数据的时候,再等待异步IO完成. 使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情).

Android handler异步更新

- - 博客园_首页
private static final int MSG_SUCCESS = 0;// 获取图片成功的标识. private static final int MSG_FAILURE = 1;// 获取图片失败的标识. mImageView.setImageBitmap((Bitmap) msg.obj);// imageview显示从网络获取到的logo.