`
qiezi
  • 浏览: 498716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Io Language学习:并行map的运行原理

阅读更多
前面给了个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效率高很多。
0
0
分享到:
评论
1 楼 simohayha 2008-01-31  
这里有个基于ruby1.9的actor模型的实现

http://revactor.org/

相关推荐

    《ISO C++11》英文版

    《ISO C++11》是C++编程语言的最新标准,它在2011年正式发布,全称为“Working Draft, Standard for Programming Language C++”。这个标准对C++进行了大量的改进和扩展,旨在提高其效率、可读性和现代性。C++11引入...

    Hive 编程指南

    - **HQL(Hive Query Language)**:Hive的语言接口,类似于SQL,用于查询和管理数据仓库。 2. **Hive架构**: - **元数据**:存储关于表和分区的信息,通常在MySQL或Derby等数据库中。 - **驱动器**:解析HQL,...

    Java、.NET面试题(技术笔试题)各多套含答案word版

    2. **.NET框架**:理解CLR(Common Language Runtime)的工作原理,以及ASP.NET、WPF、WinForms等应用程序模型。 3. **ADO.NET**:数据库操作,Dataset、DataTable、DataAdapter的使用,以及Entity Framework等ORM...

    面试题(公司常用的)很详细希望对你有帮助 包含Java,.Net,机试题,等相关的资料

    - **.NET Framework**:理解CLR(Common Language Runtime)和CLS(Common Language Specification)的作用。 - **ASP.NET**:Web Forms、MVC、Web API的开发模式及其应用场景。 - **LINQ**:理解查询表达式和...

    net java 面试题 加答案

    5. **IO与NIO**:理解字节流和字符流,缓冲区操作,以及NIO(New IO)的非阻塞特性。 6. **Spring框架**:包括依赖注入、AOP(面向切面编程)、事务管理,以及Spring Boot、Spring Cloud等相关概念。 7. **JDBC**...

    The Research of Java Language.zip

    Java标准库提供了大量的类和接口,例如集合框架(List、Set、Map等)、IO流、网络编程API等,这些都是开发日常应用必不可少的工具。学习如何有效地利用这些类库可以极大地提高开发效率。 并发处理是Java的一个强项...

    mapred.github.io

    核心概念包括“Map”阶段,数据被切分成键值对并在多台机器上并行处理;“Reduce”阶段,处理结果被聚合以生成最终输出。MapReduce通过容错机制确保即使在部分节点故障时也能完成计算任务。 2. **MapReduce与HTML的...

    hive&&hadoop成套配置资源

    3. **MapReduce**:Map阶段将数据拆分成键值对,Reduce阶段则对键值对进行聚合操作,实现大规模数据的并行处理。 4. **YARN**:YARN(Yet Another Resource Negotiator)是Hadoop 2.x引入的资源管理系统,替代了...

    Data-Structure-and-Algorithms:Python,JavaScript,C#,Java

    - 文件I/O和网络编程:学习Java的IO和NIO框架,处理输入输出和网络通信。 以上只是各语言数据结构与算法的一部分概述,深入学习还需要结合实际项目和练习来提升。"Data-Structure-and-Algorithms-master"这个...

    2023Java高频面试题

    Java是一种强大的、跨平台的编程语言,其设计目标是实现“一次编写,到处运行”。它在软件开发领域占据着重要地位,特别是在企业级应用、Web服务和移动应用中。Java的特点包括面向对象、自动内存管理(垃圾回收)...

Global site tag (gtag.js) - Google Analytics