论坛首页 编程语言技术论坛

Ruby的伪线程

浏览 25236 次
该帖已经被评为良好帖
作者 正文
   发表时间:2006-10-28  
    Ruby的Thread是伪线程,不管代码中写了多少个Thread.new,Ruby都只启动了一个线程去运行这些Thread的代码。

    这样做的确使得Ruby的Thread很容易控制,程序也不容易产生类似死锁这类严重的线程问题。但是效率始终无法提高,因为在ruby进程中,实际上只有一个真实的线程在运行,同样的代码在那么多核或者多cpu的电脑上运行效率和单核cpu的电脑上的效率并不会相差多少。

    于是有两个衍生问题:

    第一,不太可能用ruby编写桌面程序。桌面程序大都是单进程,多线程模型。因为ruby用的是伪线程,Thread.new用的越多,运行效率只会越来越低。CPU需要分配时间片给Ruby进程中的控制Ruby伪线程代码的Thread,然后这个Thread还要在切换运行全部的Ruby伪线程代码。所以在单进程中,Thread.new的应用数目是存在一定上限的。

    也许把Ruby代码嵌入到别的项目中就可以应用于桌面程序,不过同样,Thread.new还是不能多用。

    同样的,想用Ruby来编写一个稍高性能服务器程序,也是不行的。伪线程问题始终在制约这点。
   
    第二,Ruby项目最好采用多进程模型,只有这样才能更好的利用硬件资源。这个也是目前Ruby Web的设置方式。
    
    想让ruby运行的好,似乎只有这种办法了。不过多进程模型,除了web应用之外,还真不知道那里可以这样用,请知道更多的同学提醒下。

    当然,如果hack过ruby的源代码,说不定能够解决这个伪线程问题,不过这个难度甚高,不容易实现。
   
    最后的疑问是"Ruby为啥要用伪线程?"

   

   发表时间:2006-10-28  
是不是存在这样一个误解:用真正的多线程会提高效率?用伪线程才会降低效率?

一个操作系统中运行的线程超过CPU数量就可能有线程切换,线程越多,效率就越低,让我们感觉到多线程高效是因为它让一些同步IO延时变得不那么明显了。

在单CPU时,如果有完整的异步IO支持,线程并不是必要的,线程本身是为了简化异步IO调用才需要的。异步IO在很多操作系统中都是最基本的实现,很多同步调用是用异步来模拟的。多CPU时,用多进程也可以充分利用CPU资源。
0 请登录后投票
   发表时间:2006-10-28  
qiezi 写道
是不是存在这样一个误解:用真正的多线程会提高效率?用伪线程才会降低效率?



单核单cpu上同样的任务,用多线程完成,比起单线程完成所消耗时间是需要多些的。线程的切换时间就是额外多出来的那部分。

但是ruby用伪线程,想开发高效的单进程ruby项目,明显是无望的。想效率高些也只能多进程了。
0 请登录后投票
   发表时间:2006-10-28  
YARV应该是native thread了吧。
伪线程的好处是可移植性。别的看不到。
进程切换和线程切换在代价上有很大的区别,进程间通讯和线程间共享的机制也不同。其实,进程模型导致所做的WEB应用必须是SNA的,否则复杂度呈指数上升。
应该说大家都喜欢native thread.
0 请登录后投票
   发表时间:2006-10-28  
YARV虽好,最终能否完成,还不一定,伪线程这个问题,估计能够困扰使用者很长一段时间.
0 请登录后投票
   发表时间:2006-10-28  
YARV跳票是必然的。而且听说
引用

And then Matz and Koichi dropped the bomb: Ruby 2.0 would support neither continuations nor green threads.

来源:http://headius.blogspot.com/2006/10/another-year-another-interpreter.html
看看parrot,真是一把辛酸泪啊。本来python3000也要新起炉灶的,有了这个前车之鉴,最后还是决定在老的codebase上面发展。
其实这方面最经典的例子是netscape浏览器,当初逐渐消亡,IE的猛烈攻势是一个方面,但是新版迟迟不能推出,也是一个重要因素.
0 请登录后投票
   发表时间:2006-10-28  
这个老消息了:Matz说明年圣诞会出个整合YARV的1.9.1版(不过1.9始终还是测试分支,唉)。不过以往Matz没跳过票,姑且相信他的人格巴~

看样子有两个全职开发人员的JRuby说不准可能走在只有一个人业余开发的YARV前面呢。同时大部分Java库是thread-safe的,而Ruby的C扩展库不是,这也是个大麻烦。最近YARV的作者说线程模型参照Python的,也就是本地线程加全局锁,所以还是不能利用多CPU,不过以前的C扩展照用,没有同步问题。

轻量级线程不见得很糟糕巴?Erlang不就是用这个的?大概奥秘在调度器里面,这个俺土就不懂了,等布娃娃大人和T1大人来讲解巴。。。
0 请登录后投票
   发表时间:2006-10-28  
哎。Ruby总是搞得大家心里没底

04年的时候我就听说05年圣诞会出Ruby 2.0
。。。


看看PEP,人家04年就开始着手Python 2.5了,而且有相应的时间表和路线图--发布只比预期推迟了个把月。
0 请登录后投票
   发表时间:2006-10-28  
引用

And then Matz and Koichi dropped the bomb: Ruby 2.0 would support neither continuations nor green threads.


是啊。我也注意到了这条消息

我困惑的是,以后Ruby用什么来作外部迭代呢?(现在是用call/cc实现的generator)
0 请登录后投票
   发表时间:2006-10-28  
erlang是轻量级进程,不是轻量级线程。而且,erlang的编程范式和实现模型和普通的OO为主的语言相差巨大,估计很难借鉴到python/ruby之类的动态语言中。
python的线程模型也被贬得要死。不过GIL据称也提供了很多安全保障,如果去掉,编程模型上和性能上都会有很多损失(??偶也很不解)
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics