Ruby 1.8 使用用户空间线程,而不是操作系统线程。这意味着无论您创建多少 Ruby 线程,Ruby 1.8 都只能使用一个 CPU 内核。
从好的方面来说,并非一切都是坏事。Ruby 1.8内部使用非阻塞 I/O,而 Ruby 1.9 在执行 I/O 时解锁全局解释器锁。因此,如果一个 Ruby 线程在 I/O 上被阻塞,另一个 Ruby 线程可以继续执行。同样,Ruby 足够聪明,可以让诸如 sleep() 甚至 waitpid() 之类的东西抢占其他线程。
以上是Phusion 人最近的一篇博客文章的摘录。
MRI 如何在内部处理磁盘 I/O?
据我所知,通过 select/epoll/kqueue 以非阻塞方式进行磁盘 I/O 是不可能的,因为它fds
始终是可读/可写的。因此,我希望 MRI 在执行文件 I/O 时会阻塞,但如果它阻塞,则编写多线程程序毫无意义。MRI 是否有一个内部线程池,这些阻塞 I/O 调用被卸载到该线程池中?