我正在尝试理解1.9和1.9之前的Ruby线程(在标准的MRI实现中)之间的区别,但似乎就你可以用它们实现的好处而言,它们实际上是相同的。这是对的吗?
从我有限的理解:
这是正确的,还是我错过了什么? 1.9线程与1.9之前的线程(在MRI中)有什么好处?
答案 0 :(得分:1)
我觉得有点愚蠢地提供这个作为答案,但你的描述完全符合我对情况的理解。
如果我们是对的,我应该补充说,以这种方式发展语言确实有意义。
请记住,functional编程,the Actor Model,和其他共享内存替代并行模型的要点是解决开发并行共享内存应用程序的极大困难。 ("Threads considered harmful.")
因此,对于Ruby来说,从无到有并行到并行的所有内容都会有太多的期望。
目前的做法似乎是建立机制,但要保持巨大的锁定。我认为将来,单独调试和测试的功能区域将被允许并行执行,因为它们接收细粒度锁和并发测试。
答案 1 :(得分:1)
你的分析是完全正确的,ruby 1.9现在使用本机线程,但由于有全局解释器锁,你在红宝石代码中实际上没有得到任何东西。
在其他实现中已经有一些工作要改变它:
JRuby已经删除了GIL(我不确定是否曾经开始使用GIL)但实施并不是100%与MRI兼容,主要是因为本机宝石如果你使用它们(JRuby没有允许C扩展名
Rubinius 2.0将摆脱GIL并且现在应该接近完成的工作:预发布版本已经过测试并且已经很好用了。
编辑:ruby 1.9但是添加了Fiber,在特定情况下它可以是一个不错的选择,它们就像线程,但你是安排它们的人。
Edit2:2.0开发者版本上的rubinius新闻:http://rubini.us/2011/06/07/inside-rubinius-20-preview/
答案 2 :(得分:0)
在1.9下,一个线程可以进行I / O,而另一个线程是doing CPU work。
我听到了一个常见的误解 在做的时候,Ruby固有地“阻止” 磁盘IO或进行数据库查询。在 现实中,Ruby切换到另一个 线程,只要它需要阻止 IO。换句话说,如果一个线程需要 等待,但没有使用任何CPU, Ruby的内置方法允许另一种方法 等待线程使用CPU的同时 原始线程等待。
这对我没什么帮助,因为我不是受限于I / O,但对你来说这可能是个好消息。