当设计并发策略时,要将 "what做什么"和 "how怎么做"进行分离,
Prefer Futures to Baked-In "Async APIs"
一文介绍了如何使用语言的并行API通过异步
来实现这点。
普通同步性质的方法如下:
RetType DoSomething(
InParameters ins,
OutParameters outs
);
|
如果DoSomething 将花费很长时间执行,无论它是否耗费CPU,比如从数据库中加载一个数据就是很耗费时间的,那么是不是在DoSomething执行的同时,我们做做其他事情呢?
比如:
result = DoSomething( this
, that, outTheOther );
OtherWork();
|
如果OtherWork不依赖result 这个值,那么我们让DoSomething使用通常意义上的异步
执行就没有问题。
但是如果OtherWork依赖上一步执行结果result,怎么办?
第一个方案是使用Begin/End 模式实现:
设计一个开始接口,如下
IAsyncResult BeginDoSomething(
InParameters ins
);
|
再设计一个结果接口,如下:
RetType EndDoSomething(
IAsyncResult asyncResult,//上一接口计算的结果
OutParameters outs
);
|
使用方式如下代码:
IAsyncResult ar = BeginDoSomething( this
, that );
result = DoSomething( this
, that, outTheOther );
//在DoSomething运行同时,执行OtherWork
OtherWork();
//将上面两个融合Join,
ar.AsyncWaitHandle.WaitOne();
//必要时需要等待
result = EndDoSomething( ar, outtheOther );
|
这个模式需要在最后等待,无论DoSomething和OtherWork哪个先做完,都要等待对方,这个性能会很差,当然该文从.NET框架等多个角度说明这个模式一些局限,这里不再引述,可以参考原文。
我们主要目的是要将“如何异步
运行这个工作 ”(也就是调用"how如何做")和做什么分离开来。在上面这个案例中,我们关注的是让DoSomething和OtherWork异步启动,而DoSomething如何异步
运行(how),应该不是我们关心的,至少应该从上面这段调用代码中分离出去。而 begin/end 模式并没有帮助我们做到这点,相反是将How和What耦合在一起了。
让我们来看看如何实现How和What分离解耦:
1.使用一个分离的Task任务调用来运行How的工作内容,根据你的语言平台,比如如果是Java/.NET,使用pool.run( /*task*/ ),如果C++0x,使用async( /*task*/ ) .
2.使用futures来管理异步
运行的结果. 这实际就是类Java JDK中的Future<T> API, C++0x标准即将也会有,而.NET下一个版本使用的是Task<T>.
这样,上面案例代码如下:
//第一步 asynchronous call
future<int
> result =
async( ()=<{ return
CallSomeFunc(x,y,z); } );
//第二步 code here runs concurrently with CallSomeFunc
//同时运行其他事情
//第三步 use result when it's ready (this might block)
//在这里使用异步
运行dosomething的结果
DoSomethingWith( result.value() );
|
这里代码为什么和前面代码不完全一致,因为我们根据How和What分离,更改了设计,如果前面案例的otherwork依赖DoSomething的结果,那么,我们就要将otherwork内容进行分解,将otherwork中不依赖DoSomething结果的内容首先运行,也就是上面第二步,然后,使用在第三步,我们将两个计算结果融合。
这种使用Future特性将How和What分离的模式,已经被使用在Jdonframework
6.2的Domain Events,实际就是Domain Events的内在机制,当领域模型中激活一个事件时,实际就是发送了一个消息,在Jdonframework
中,监听消息实际执行如下代码:
private
void
asynExecMessageListener(final
DomainMessage message) {
FutureTask futureTask = new
FutureTask(new
Callable<Boolean>() {
public
Boolean call() throws Exception {
try
{
message.getMessageListener().action(message);
} catch
(Exception e) {
....
return
true
;
}
});
message.addFutureTask(futureTask);//运行futuretask
executor.execute(futureTask);
//相当于pool.run
}
|
应该说:JdonFramework 6.2是将EDA和Java并行计算,异步可伸缩性
融合在一起,在设计理念是先进的,本文也可以验证这点。参考Domain Events异步应用
原文:http://www.jdon.com/jivejdon/thread/38006
分享到:
相关推荐
JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等
【Flutter】Future 与 FutureBuilder 异步编程代码示例 ( FutureBuilder 构造函数设置 | 处理 Flutter 中文乱码 | 完整代码示例 ) https://hanshuliang.blog.csdn.net/article/details/119924412 博客源码快照
Flutter通过FutureBuilder实现异步请求网络数据并显示加载中Demo,详情请看博客Flutter中的异步(Future、async、await、FutureBuilder)和 网络请求:https://yuzhiqiang.blog.csdn.net/article/details/89155870
主要为大家详细介绍了Java多线程之异步Future机制的原理和实现,感兴趣的小伙伴们可以参考一下
Java多线程之异步Future机制的原理和实现共5页.pdf.zip
主要给大家介绍了关于Spring Boot利用@Async异步调用:使用Future及定义超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友可以参考下
异步深度强化学习 从Google DeepMind的论文实现异步一步式Q学习 当前实施异步一步式Q学习的基准: 设备输入形状FPS (不计算跳过的帧) GPU GTX 980 Ti 84x84x4 〜530 CPU核心i7-3770 @ 3.40GHz(4核,8线程) 84x84...
这个代码实现了一个简单的网络请求,使用了Java中的异步编程模型。 首先,我们定义了一个URL地址和一个超时时间(TIMEOUT),然后使用ExecutorService创建了一个线程池,该线程池包含两个线程。接下来,我们通过...
zebra-dao是在mybatis基础上进一步封装的异步DAO,同时它也支持分页功能... 支持Callback和Future两种异步化方式 支持分页功能 其他功能的使用方式和mybatis一致 标签:zebra
stateless-future, 在完全特色的Scala 语法中,异步编程 无状态未来 无状态未来是一组特定于异步编程的领域特定语言,在纯功能。无状态期货为 scala.concurrent.Future 和 scala.async 提供类似的API,除了无状态...
它旨在(主要)避免使用Future模式,并通过回调来开展业务。 我们尽可能避免引入复杂的抽象,这些抽象试图隐藏HTTP通信的业务。 而是您的代码可以根据需要参与或多或少地参与其中。 您可以Maven项目中使用它。 ...
需要注意的是,在实际的异步请求中,可能需要使用Future或其他方式来等待请求的完成,并获取返回结果。上面的示例只是演示了如何使用多线程来执行异步请求,具体的处理逻辑需要根据实际需求进行修改
使用future处理并发1
我们放弃了Stateless Future内置的async / await支持,转而使用了提供的更通用的monadic / each语法。 future.scala提供类似于scala.concurrent.Future或scalaz.concurrent.Task的API,但scalaz.concurrent.Task...
async-react-future-今天从'./future'导入*! 汇总了每个人使用Async React所做的所有事情,以便于进行演示和实验。 警告:此内容不得用于生产该库可帮助人们尝试所探索Async React。实际观看非暂停演示克隆简单的...
Future - 基于微框架设计思想的异步执行及结果响应类,代码即简单又干净-- swift。
future是一种对象,表示异步执行的操作。下面这篇文章主要给大家介绍了关于python中利用Future对象异步返回结果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
future源码Java中具有CompletableFuture的异步编程 介绍 CompletableFuture API是用于Java异步编程的高级API。 该API支持将多个异步计算流水线化(也称为链接或合并)成单个结果,而不会造成嵌套回调(“ callback ...
主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下