当设计并发策略时,要将 "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
分享到:
相关推荐
它不仅实现了Future接口,还提供了丰富的链式调用API,允许我们在异步任务完成后进行后续处理。 - 示例:`CompletableFuture.supplyAsync(() -> timeConsumingTask()).thenAccept(result -> processResult(result))...
asyncio是Python的内置异步I/O框架,用于编写并发和高性能网络应用。在"future-0.18.3"中,library可能对asyncio进行了进一步的包装,以便在Python 2环境下也能使用类似Python 3的异步编程模型。这包括了`async`和`...
3. 高级API:包括`futures`模块(Python 2.7中的异步编程工具)和`builtins`模块(用于替换Python 2的内置函数,如`map()`、`filter()`等,使其行为更接近Python 3)。 4. `compat`模块:包含了用于处理Python 2和...
在Python中,异步编程是通过事件循环和协程来实现的,Future是这种编程模型的核心组件。 在Python 3.7及更高版本中,内置了`asyncio`库,它是Python标准库的一部分,而`Future`类是`asyncio`库中的一个重要概念。`...
开发者可以通过查阅API文档了解如何使用这些组件,实现特定的功能。JDK 1.6.0的API中文版对于中国开发者来说尤为重要,因为语言障碍的消除使得学习和开发过程更为流畅。 三、JDK 1.6.0新特性 1. **增强的Swing组件...
我们放弃了Stateless Future内置的async / await支持,转而使用了提供的更通用的monadic / each语法。 future.scala提供类似于scala.concurrent.Future或scalaz.concurrent.Task的API,但scalaz.concurrent.Task...
9. **并发处理**:Spring 3.2.0提供了对Java并发API的封装,包括线程池、Future和Callable接口的实现,方便开发者处理多线程问题。 10. **消息支持**:Spring的Message模块支持消息传递,包括JMS(Java Message ...
4. **NIO.2**(New IO 2):引入了新的文件系统API,提供了异步I/O操作,文件属性查询,文件遍历等功能,使文件操作更加灵活和高效。 5. **改进的Swing**:1.6版本对Swing组件进行了优化,提供了更好的外观和感觉,...
- 对于长时间运行的任务,考虑使用Future或ExecutorService来异步执行,以免影响Scheduler性能。 以上是对Quartz API的详细概述,它为Java开发人员提供了强大的定时任务管理工具,通过合理使用,可以极大地提升...
3. **异步编程**:Dart支持异步编程,通过Future和async/await语法,使得异步操作更加简洁易读。此外,还有Stream API,用于处理连续的数据流。 4. **包管理器与依赖管理**:Dart的`pub`是其内置的包管理器,用于...
2. **枚举(Enums)**:Java 1.6引入了枚举类型,使得枚举常量的使用更加规范,同时提供了许多内置的方法和特性,如`values()`和`valueOf()`。 3. **并发编程改进**:添加了`java.util.concurrent`包,包含各种线程...
使用JDK6 API中文参考手册,开发者可以按照类名、接口名或方法名进行查找,理解每个类的功能、方法的参数和返回值,以及它们在实际编程中的应用场景。此外,手册通常会包含示例代码,帮助开发者快速上手。 总结,...
你需要理解Java并发编程的基本概念,如synchronized关键字、Callable和Future接口,或者使用CompletableFuture进行异步操作。 6. **短信模板与签名**:第三方平台通常会提供预设的短信模板,包含动态变量,比如...
3. **Futures**:Rust的标准库提供了一套基于`Future`特质的API,用于构建异步工作流。 #### I/O 特性 Rust的标准库中提供了用于I/O操作的多个特质,例如`Read`和`Write`特质。这两个特质定义了基本的读写操作,为...
Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。Java语言...
4. **并发支持**:如`scala.concurrent`包下的Actor和Future等类,用于处理并发和异步编程。 5. **类型系统**:如类型参数、类型成员、类型别名等高级类型系统概念。 使用这个API文档,开发者可以快速查找特定功能...
4. **I/O流**: 包含字节流、字符流、缓冲流、对象流等,以及NIO(New I/O)API,提供了异步I/O操作。 5. **多线程**: Thread类、Runnable接口、ExecutorService、Future等,以及并发控制的工具类如Semaphore、...
其异步API设计,跨平台支持以及内置的JSON处理和身份验证功能,都极大地简化了云通信的开发工作。通过熟练掌握cpp-CRESTSDK,开发者可以更便捷地实现基于云的客户机-服务器通信,提升软件项目的质量和效率。
未来库(futured,这个名字可能是对"future"的变体或者误写)可能是为了解决Python的一些特定问题或提供特定功能,比如向后兼容性、异步编程、并发处理等。 尽管没有提供futured库的具体细节,我们可以根据Python库...
2. **异步API**:对于性能敏感的应用,Redisson还提供了异步操作,使用Future或CompletableFuture实现。这种方式能充分利用多线程,提高程序的并发性,降低响应时间。 3. **RxJava支持**:Redisson集成了RxJava,...