`

使用future实现内置异步API

阅读更多

当设计并发策略时,要将 "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代码实现异步调用代码

    它不仅实现了Future接口,还提供了丰富的链式调用API,允许我们在异步任务完成后进行后续处理。 - 示例:`CompletableFuture.supplyAsync(() -&gt; timeConsumingTask()).thenAccept(result -&gt; processResult(result))...

    future-0.18.3

    asyncio是Python的内置异步I/O框架,用于编写并发和高性能网络应用。在"future-0.18.3"中,library可能对asyncio进行了进一步的包装,以便在Python 2环境下也能使用类似Python 3的异步编程模型。这包括了`async`和`...

    python安装打包依赖包-future-0.18.1.tar.gz

    3. 高级API:包括`futures`模块(Python 2.7中的异步编程工具)和`builtins`模块(用于替换Python 2的内置函数,如`map()`、`filter()`等,使其行为更接近Python 3)。 4. `compat`模块:包含了用于处理Python 2和...

    future-0.18.1.tar.gz

    在Python中,异步编程是通过事件循环和协程来实现的,Future是这种编程模型的核心组件。 在Python 3.7及更高版本中,内置了`asyncio`库,它是Python标准库的一部分,而`Future`类是`asyncio`库中的一个重要概念。`...

    IDK API 1.6.0中文.rar

    开发者可以通过查阅API文档了解如何使用这些组件,实现特定的功能。JDK 1.6.0的API中文版对于中国开发者来说尤为重要,因为语言障碍的消除使得学习和开发过程更为流畅。 三、JDK 1.6.0新特性 1. **增强的Swing组件...

    future.scala:堆栈安全的异步编程

    我们放弃了Stateless Future内置的async / await支持,转而使用了提供的更通用的monadic / each语法。 future.scala提供类似于scala.concurrent.Future或scalaz.concurrent.Task的API,但scalaz.concurrent.Task...

    Spring 3.2.0 API_CHM

    9. **并发处理**:Spring 3.2.0提供了对Java并发API的封装,包括线程池、Future和Callable接口的实现,方便开发者处理多线程问题。 10. **消息支持**:Spring的Message模块支持消息传递,包括JMS(Java Message ...

    JDK_API_1_6

    4. **NIO.2**(New IO 2):引入了新的文件系统API,提供了异步I/O操作,文件属性查询,文件遍历等功能,使文件操作更加灵活和高效。 5. **改进的Swing**:1.6版本对Swing组件进行了优化,提供了更好的外观和感觉,...

    Quartz API

    - 对于长时间运行的任务,考虑使用Future或ExecutorService来异步执行,以免影响Scheduler性能。 以上是对Quartz API的详细概述,它为Java开发人员提供了强大的定时任务管理工具,通过合理使用,可以极大地提升...

    Dart_官网文档_docs-gen-api

    3. **异步编程**:Dart支持异步编程,通过Future和async/await语法,使得异步操作更加简洁易读。此外,还有Stream API,用于处理连续的数据流。 4. **包管理器与依赖管理**:Dart的`pub`是其内置的包管理器,用于...

    JDK API 1.60 中文版chm帮助文档

    2. **枚举(Enums)**:Java 1.6引入了枚举类型,使得枚举常量的使用更加规范,同时提供了许多内置的方法和特性,如`values()`和`valueOf()`。 3. **并发编程改进**:添加了`java.util.concurrent`包,包含各种线程...

    JDK6API中文参考手册

    使用JDK6 API中文参考手册,开发者可以按照类名、接口名或方法名进行查找,理解每个类的功能、方法的参数和返回值,以及它们在实际编程中的应用场景。此外,手册通常会包含示例代码,帮助开发者快速上手。 总结,...

    java调用第三方的短信接口

    你需要理解Java并发编程的基本概念,如synchronized关键字、Callable和Future接口,或者使用CompletableFuture进行异步操作。 6. **短信模板与签名**:第三方平台通常会提供预设的短信模板,包含动态变量,比如...

    程序设计训练之 Rust 编程语言 第七讲:I/O 与异步编程

    3. **Futures**:Rust的标准库提供了一套基于`Future`特质的API,用于构建异步工作流。 #### I/O 特性 Rust的标准库中提供了用于I/O操作的多个特质,例如`Read`和`Write`特质。这两个特质定义了基本的读写操作,为...

    异步编程的瑞士军刀:Java中Future和Callable接口的妙用

    Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。Java语言...

    Scala-2.8.1-API.chm.7z

    4. **并发支持**:如`scala.concurrent`包下的Actor和Future等类,用于处理并发和异步编程。 5. **类型系统**:如类型参数、类型成员、类型别名等高级类型系统概念。 使用这个API文档,开发者可以快速查找特定功能...

    JAVA SE API 1.8 中文手册

    4. **I/O流**: 包含字节流、字符流、缓冲流、对象流等,以及NIO(New I/O)API,提供了异步I/O操作。 5. **多线程**: Thread类、Runnable接口、ExecutorService、Future等,以及并发控制的工具类如Semaphore、...

    cpp-CRESTSDK是一个微软项目用于基于云的客户机服务器通信

    其异步API设计,跨平台支持以及内置的JSON处理和身份验证功能,都极大地简化了云通信的开发工作。通过熟练掌握cpp-CRESTSDK,开发者可以更便捷地实现基于云的客户机-服务器通信,提升软件项目的质量和效率。

    Python库 | futured-0.1-py3-none-any.whl

    未来库(futured,这个名字可能是对"future"的变体或者误写)可能是为了解决Python的一些特定问题或提供特定功能,比如向后兼容性、异步编程、并发处理等。 尽管没有提供futured库的具体细节,我们可以根据Python库...

    Redisson Easy Redis Java客户端和实时数据平台SyncAsyncRxJavaReactive A.zip

    2. **异步API**:对于性能敏感的应用,Redisson还提供了异步操作,使用Future或CompletableFuture实现。这种方式能充分利用多线程,提高程序的并发性,降低响应时间。 3. **RxJava支持**:Redisson集成了RxJava,...

Global site tag (gtag.js) - Google Analytics