Ruby 1.8使用用户空间线程,而不是操作系统线程。这意味着无论您创建多少个Ruby线程,Ruby 1.8都只能使用单个CPU核心。
从好的方面来看,并非一切都很糟糕。 Ruby 1.8 在内部使用非阻塞I / O ,而Ruby 1.9在执行I / O时解锁全局解释器锁。因此,如果在I / O上阻塞了一个Ruby线程,则另一个Ruby线程可以继续执行。同样,Ruby非常聪明,可以导致像sleep()甚至waitpid()这样的东西抢占其他线程。
以上是Phusion人员最近blog post的摘录。
MRI如何在内部处理磁盘I / O?
从我收集的内容来看,由于fds
始终是可读/可写的,因此无法通过select / epoll / kqueue以非阻塞方式执行磁盘I / O.所以我希望MRI在文件I / O时会阻塞,但如果它阻塞,那么写一个多线程程序是没有意义的。 MRI是否有一个内部线程池,这些阻塞I / O调用被卸载到哪个?
答案 0 :(得分:2)
Yehuda Katz是Rails 3的核心贡献者之一,他在博客中详细介绍了这一点: http://yehudakatz.com/2010/08/14/threads-in-ruby-enough-already