`
jack
  • 浏览: 392468 次
  • 来自: 温州
社区版块
存档分类
最新评论

Ruby的伪线程

阅读更多
    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为啥要用伪线程?"

   

分享到:
评论
12 楼 charon 2006-10-28  
buaawhl 写道

伪线程如果有一个优异的线程调度器,效率方面甚至可以超过native thread。
比如,ErLang VM,可以达到Soft Realtime 软实时。

-------- in case of some question about Soft Realtime

"""
A hard realtime system is one which can guarantee that a certain
action will always be carried out in less than a certain time. Many
simple embedded systems can make hard realtime guarantees, e.g. it
is possible to guarantee that a particular interrupt service routine
on a Z80 CPU will never take more than 34us. It gets progressively
harder to make such guarantees for more complex systems.

Many telecomms systems have less strict requirements, for instance
they might require a statistical guarantee along the lines of "a
database lookup takes less than 20ms in 97% of cases". Soft realtime
systems, such as Erlang, let you make that sort of guarantee.
"""


Erlang的轻量级进程模型唯一的进程间通讯方式是消息机制。进程内容在相互之间是完全解耦的,要进行数据交换共享必须通过进程间通讯.
线程模型不一样,不论是伪线程还是native线程,允许共享数据.
这个会在实现模式和编程模型上带来很大区别
11 楼 njmzhang 2006-10-28  
- YARV does not support continuations now
- YARV can support continuations, but it's not a high priority
- Ruby 1.9.1 + YARV probably won't have continuations
- Matz does want continuations to eventually be supported by YARV

没有callcc就不好玩了...
10 楼 buaawhl 2006-10-28  

伪线程如果有一个优异的线程调度器,效率方面甚至可以超过native thread。
比如,ErLang VM,可以达到Soft Realtime 软实时。

-------- in case of some question about Soft Realtime

"""
A hard realtime system is one which can guarantee that a certain
action will always be carried out in less than a certain time. Many
simple embedded systems can make hard realtime guarantees, e.g. it
is possible to guarantee that a particular interrupt service routine
on a Z80 CPU will never take more than 34us. It gets progressively
harder to make such guarantees for more complex systems.

Many telecomms systems have less strict requirements, for instance
they might require a statistical guarantee along the lines of "a
database lookup takes less than 20ms in 97% of cases". Soft realtime
systems, such as Erlang, let you make that sort of guarantee.
"""
9 楼 charon 2006-10-28  
erlang是轻量级进程,不是轻量级线程。而且,erlang的编程范式和实现模型和普通的OO为主的语言相差巨大,估计很难借鉴到python/ruby之类的动态语言中。
python的线程模型也被贬得要死。不过GIL据称也提供了很多安全保障,如果去掉,编程模型上和性能上都会有很多损失(??偶也很不解)
8 楼 Suninny 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)
7 楼 Suninny 2006-10-28  
哎。Ruby总是搞得大家心里没底

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


看看PEP,人家04年就开始着手Python 2.5了,而且有相应的时间表和路线图--发布只比预期推迟了个把月。
6 楼 cookoo 2006-10-28  
这个老消息了:Matz说明年圣诞会出个整合YARV的1.9.1版(不过1.9始终还是测试分支,唉)。不过以往Matz没跳过票,姑且相信他的人格巴~

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

轻量级线程不见得很糟糕巴?Erlang不就是用这个的?大概奥秘在调度器里面,这个俺土就不懂了,等布娃娃大人和T1大人来讲解巴。。。
5 楼 charon 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的猛烈攻势是一个方面,但是新版迟迟不能推出,也是一个重要因素.
4 楼 jack 2006-10-28  
YARV虽好,最终能否完成,还不一定,伪线程这个问题,估计能够困扰使用者很长一段时间.
3 楼 charon 2006-10-28  
YARV应该是native thread了吧。
伪线程的好处是可移植性。别的看不到。
进程切换和线程切换在代价上有很大的区别,进程间通讯和线程间共享的机制也不同。其实,进程模型导致所做的WEB应用必须是SNA的,否则复杂度呈指数上升。
应该说大家都喜欢native thread.
2 楼 jack 2006-10-28  
qiezi 写道
是不是存在这样一个误解:用真正的多线程会提高效率?用伪线程才会降低效率?



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

但是ruby用伪线程,想开发高效的单进程ruby项目,明显是无望的。想效率高些也只能多进程了。
1 楼 qiezi 2006-10-28  
是不是存在这样一个误解:用真正的多线程会提高效率?用伪线程才会降低效率?

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

在单CPU时,如果有完整的异步IO支持,线程并不是必要的,线程本身是为了简化异步IO调用才需要的。异步IO在很多操作系统中都是最基本的实现,很多同步调用是用异步来模拟的。多CPU时,用多进程也可以充分利用CPU资源。

相关推荐

    积分java源码-CreditsCPlusPlusDemoCMake:在C++(CMake)中使用CREDITSAPI

    编程语言的一组库,为线性代数、伪随机数生成、多线程、图像处理、正则表达式和单元测试等任务和结构提供支持。 它包含八十多个单独的库。 CMake 是一个开源、跨平台的工具系列,旨在构建、测试和打包软件。 CMake ...

    大数据面试题(1).docx

    29. **Map槽与线程**:在MapReduce中,每个map槽对应一个单独的线程,用于执行map任务。 30. **Input Split与Block关系**:MapReduce的input split通常基于HDFS的Block来划分,但可以自定义split逻辑。 31. **...

    大数据面试题(1).doc

    29. **Map槽与线程**:每个map槽代表一个处理任务的线程。 30. **Input Split与Block关系**:在MapReduce中,input split通常对应于一个或多个HDFS的Block。 31. **NameNode Web UI**:NameNode的Web UI默认运行在...

    大数据面试题 (2).pdf

    - 解析:MapReduce提供了多种语言的API,如Python、Ruby等。 19. Hadoop是否支持数据的随机读写? - 答案:不直接支持,HDFS设计为顺序读写优化。 - 解析:HDFS主要设计用于大规模批处理,不擅长随机读写。 20....

    大数据面试题.pdf

    29. **map槽与线程**:每个map槽对应一个并行处理任务,不一定是线程,取决于具体实现。选项部分正确。 30. **Input Split与Block**:MapReduce的Input Split可以是Block或其子集,不一定是完整的Block。选项部分...

    大数据技术Hadoop笔试题.doc.pdf

    29. **Map槽与线程**:每个map槽通常对应一个线程,用于执行map任务(答案正确)。 30. **Input Split与Block**:MapReduce的input split通常基于Block,但并不完全等同,split可以根据输入格式被划分为更小的单位...

    大数据技术Hadoop面试题 (2).pdf

    18. Hadoop虽然主要是用Java开发,但MapReduce也支持其他编程语言,如Python和Ruby,所以这个判断题是错误的。 19. NameNode确实管理metadata,但metadata通常驻留在内存中,而不是每次读写都从磁盘读取或写入,...

    Hadoop面试100题.pdf

    - **知识点说明**:虽然Hadoop核心是由Java编写的,但MapReduce作业可以用多种编程语言编写,包括Python、Ruby等,通过相应的API实现。 7. **Hadoop支持数据的随机读写** - **知识点说明**:HDFS主要设计用于流式...

    消息事件说明文档

    - `Session`:代表一个发送或接收消息的独立线程上下文。 - `MessageProducer`:用于发送消息到指定目的地。 - `MessageConsumer`:用于接收来自特定目的地的消息。 **3.2 对象之间的关系** - 创建`...

    springCloud

    这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。 断路器示意图 SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是...

Global site tag (gtag.js) - Google Analytics