Ruby 1.8 и дисковый ввод-вывод в многопоточной настройке

Ruby 1.8 использует потоки пользовательского пространства, а не потоки операционной системы. Это означает, что Ruby 1.8 может использовать только одно ядро ​​​​ЦП, независимо от того, сколько потоков Ruby вы создаете.

С другой стороны, не все так плохо. Ruby 1.8 внутренне использует неблокирующий ввод-вывод, а Ruby 1.9 разблокирует глобальную блокировку интерпретатора при выполнении ввода-вывода. Таким образом, если один поток Ruby заблокирован при вводе-выводе, другой поток Ruby может продолжить выполнение. Точно так же Ruby достаточно умен, чтобы такие вещи, как sleep() и даже waitpid(), вытесняли другие потоки.

Выше приведен отрывок из недавнего блога. пост от людей из Phusion.

Как MRI обрабатывает дисковый ввод-вывод внутри себя?

Из того, что я понял, неблокирующий дисковый ввод-вывод через select/epoll/kqueue невозможен, поскольку fds всегда будет доступен для чтения/записи. Поэтому я ожидаю, что MRI будет блокироваться, когда он выполняет файловый ввод-вывод, но если он блокируется, нет смысла писать многопоточную программу. Есть ли в MRI внутренний пул потоков, на который перенаправляются эти блокирующие вызовы ввода-вывода?


person Harish    schedule 23.06.2010    source источник
comment
Если вы знаете C, может быть полезно прочитать: github.com/ruby/ ruby/blob/trunk/io.c   -  person Adrian    schedule 23.06.2010


Ответы (1)


Йехуда Кац, один из основных участников Rails 3, подробно написал об этом в блоге: http://yehudakatz.com/2010/08/14/threads-in-ruby-enough-already

person Ronen Botzer    schedule 24.01.2011