迫不及待地介绍这个特性,来看一下Io是如何在不改变调用过程的情况下让调用变成异步的。
先看一个同步调用:
[code]
Slow := Object clone do(
call := method(i,
wait(i)
"DONE" println
i + 1
)
)
results := list(1,2,3) map(i,
Slow clone call(i)
)
results println
[/code]
这个程序将花上6秒来完成。如果调用本身消耗CPU比较少,就可以并行来运行。上面程序只要修改一行就可以了:
[code]
Slow clone @call(i)
[/code]
由于Io的库实现还很不完善,所以不是所有操作都可以顺利完成,比如把上面的wait(i)换成System system("sleep " .. (i asString))来调用外部程序,在linux上我测试就没有成功,Mac OS X上没有问题。
[color=red](注:后来修改了一下程序也测试成功了,看来Io里面有很多小陷阱,这当然是由于它现在还不完善造成的)[/color]
[color=red](注2:测试有点错误,测试结果还是不支持System system异步调用)[/color]
可以和Erlang比较一下,Erlang并行的能力也很强,但你不得不写许多代码来完成这种并行,而且并行写起来并不是很顺手。
先看一个同步调用:
[code]
Slow := Object clone do(
call := method(i,
wait(i)
"DONE" println
i + 1
)
)
results := list(1,2,3) map(i,
Slow clone call(i)
)
results println
[/code]
这个程序将花上6秒来完成。如果调用本身消耗CPU比较少,就可以并行来运行。上面程序只要修改一行就可以了:
[code]
Slow clone @call(i)
[/code]
由于Io的库实现还很不完善,所以不是所有操作都可以顺利完成,比如把上面的wait(i)换成System system("sleep " .. (i asString))来调用外部程序,在linux上我测试就没有成功,Mac OS X上没有问题。
[color=red](注:后来修改了一下程序也测试成功了,看来Io里面有很多小陷阱,这当然是由于它现在还不完善造成的)[/color]
[color=red](注2:测试有点错误,测试结果还是不支持System system异步调用)[/color]
可以和Erlang比较一下,Erlang并行的能力也很强,但你不得不写许多代码来完成这种并行,而且并行写起来并不是很顺手。