几种并发编程模型开销(从大到小):
Process > Thread > Coroutine > Generator == Callback
从对机器的并行利用来说,却是完全相反的。
Process可以部署在不同机器上;
Thread需要在Process里面,往往是很多Thread在一个Process里面,它对多CPU利用还是比较充分的;
Coroutine在Thread里面运行,要利用多CPU,需要实现调度器;
Generator算是一种带有状态的Callback,或者是对象化的Callback,它们也需要运行在Thread里面,要利用多CPU,需要实现调度器;
为什么Generator比Coroutine要轻量一些?原因在于Coroutine是通过切换执行代码来完成的,每次切换需要保存所有寄存器再加载另一个Coroutine里面保存的寄存器状态。Generator和Callback一样,不需要这一步。
Python示例:
假想的D代码:
D如何来实现?必须要在语言中实现,让它自动把栈上变量在堆上分配,就像Closure一样。
手工模拟也是可以的,比较逻嗦,和用Class模拟Closure是一样的。
新闻组里有个提案,可惜还没有实现啊:
[url]http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=41886[/url]
Process > Thread > Coroutine > Generator == Callback
从对机器的并行利用来说,却是完全相反的。
Process可以部署在不同机器上;
Thread需要在Process里面,往往是很多Thread在一个Process里面,它对多CPU利用还是比较充分的;
Coroutine在Thread里面运行,要利用多CPU,需要实现调度器;
Generator算是一种带有状态的Callback,或者是对象化的Callback,它们也需要运行在Thread里面,要利用多CPU,需要实现调度器;
为什么Generator比Coroutine要轻量一些?原因在于Coroutine是通过切换执行代码来完成的,每次切换需要保存所有寄存器再加载另一个Coroutine里面保存的寄存器状态。Generator和Callback一样,不需要这一步。
Python示例:
def foo():
for i in range(5):
yield i
for i in foo():
print i
假想的D代码:
generator!(int) foo() {
foreach(i; 0..5)
yield(i);
}
foreach(i; foo())
writefln(i);
D如何来实现?必须要在语言中实现,让它自动把栈上变量在堆上分配,就像Closure一样。
手工模拟也是可以的,比较逻嗦,和用Class模拟Closure是一样的。
新闻组里有个提案,可惜还没有实现啊:
[url]http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=41886[/url]
2万+

被折叠的 条评论
为什么被折叠?



