前面给了个Io异步编程的例子,最后说“和Erlang比一比“,我指的是Erlang做类似的功能需要pmap。
为什么Io的List#map可以适应这种并行调用?本文简单分析一下。
通过阅读源码,首先可以确定的是map本身没有作任何特殊处理,所以重点放在"@"这个操作符上,它完成异步操作。
经过测试发现,方法如果是异步调用(应该说消息是异步发送,说方法调用感觉自然一些),如果不“使用”调用结果,是不会等待结果返回的。这里的“使用”并不是简单地赋给一个变量,而是真正使用这个变量,比如返回一个整数,简单地:
a := foo @bar
并不会等待调用的结果,只有使用a这个变量时--例如b := a+1, a println--它才会等待调用结果。
前面的并行map正是使用了这个特性,你可以觉得奇怪,结果放到一个list里面难道不算是使用吗?其实不然,它放入的是一个Proxy对象,并非真正的结果,只有你取用list成员时,它才会取结果。有一点细节是,就算你不取结果,但调用也是真的发生了,只是这边不用等待。
它是如何完成这个过程的?简单看一下Actor.io这个文件,"@"的实现就在这里:
Object do(
setSlot("@", method(
//writeln("@ ", call argAt(0))
m := call argAt(0) asMessageWithEvaluatedArgs(call sender)
f := Future clone setRunTarget(self) setRunMessage(m)
self actorRun
self actorQueue append(f)
f futureProxy
))
)
可以看出它把调用塞到队列里,然后返回一个Proxy对象,所以我们的list里实际上都是FutureProxy对象,把结果类型打印一下就知道了:
result at(0) type println
但为什么result println打印的是包含几个整数的list?
原因在于FutureProxy:
FutureProxy := Object clone do(
with := method(future,
p := self clone
p _future := future
p forward := self getSlot("_forward")
p _become := self getSlot("become")
//p xyz := method(_future writeln("XYZ!"))
p type := "FutureProxy"
p removeAllProtos
p
)
_forward := method(
//_future writeln("FutureProxy forward ", call message)
_future waitOnResult
self doMessage(call message, call sender)
)
)
它定义了forward方法,这个方法和Ruby的method_missing相似,由于它没有其它方法,所以使用它(给它发消息)时都会自然调用到这个方法。它在这里完成的功能是等待结果,然后取得结果。这个功能也可以用Ruby来完成,Io这一整套东西其实可以用Ruby 1.9来完成,很可能比现在的Io效率高很多。
分享到:
相关推荐
《ISO C++11》是C++编程语言的最新标准,它在2011年正式发布,全称为“Working Draft, Standard for Programming Language C++”。这个标准对C++进行了大量的改进和扩展,旨在提高其效率、可读性和现代性。C++11引入...
- **HQL(Hive Query Language)**:Hive的语言接口,类似于SQL,用于查询和管理数据仓库。 2. **Hive架构**: - **元数据**:存储关于表和分区的信息,通常在MySQL或Derby等数据库中。 - **驱动器**:解析HQL,...
2. **.NET框架**:理解CLR(Common Language Runtime)的工作原理,以及ASP.NET、WPF、WinForms等应用程序模型。 3. **ADO.NET**:数据库操作,Dataset、DataTable、DataAdapter的使用,以及Entity Framework等ORM...
- **.NET Framework**:理解CLR(Common Language Runtime)和CLS(Common Language Specification)的作用。 - **ASP.NET**:Web Forms、MVC、Web API的开发模式及其应用场景。 - **LINQ**:理解查询表达式和...
5. **IO与NIO**:理解字节流和字符流,缓冲区操作,以及NIO(New IO)的非阻塞特性。 6. **Spring框架**:包括依赖注入、AOP(面向切面编程)、事务管理,以及Spring Boot、Spring Cloud等相关概念。 7. **JDBC**...
Java标准库提供了大量的类和接口,例如集合框架(List、Set、Map等)、IO流、网络编程API等,这些都是开发日常应用必不可少的工具。学习如何有效地利用这些类库可以极大地提高开发效率。 并发处理是Java的一个强项...
核心概念包括“Map”阶段,数据被切分成键值对并在多台机器上并行处理;“Reduce”阶段,处理结果被聚合以生成最终输出。MapReduce通过容错机制确保即使在部分节点故障时也能完成计算任务。 2. **MapReduce与HTML的...
3. **MapReduce**:Map阶段将数据拆分成键值对,Reduce阶段则对键值对进行聚合操作,实现大规模数据的并行处理。 4. **YARN**:YARN(Yet Another Resource Negotiator)是Hadoop 2.x引入的资源管理系统,替代了...
- 文件I/O和网络编程:学习Java的IO和NIO框架,处理输入输出和网络通信。 以上只是各语言数据结构与算法的一部分概述,深入学习还需要结合实际项目和练习来提升。"Data-Structure-and-Algorithms-master"这个...
Java是一种强大的、跨平台的编程语言,其设计目标是实现“一次编写,到处运行”。它在软件开发领域占据着重要地位,特别是在企业级应用、Web服务和移动应用中。Java的特点包括面向对象、自动内存管理(垃圾回收)...