Ruby 1.8 и дисковый ввод / вывод в многопоточном режиме - PullRequest
1 голос
/ 23 июня 2010

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

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

Выше приведен отрывок из недавнего сообщения в блоге отФьюжн люди.

Как МРТ внутренне обрабатывает дисковый ввод / вывод?

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

1 Ответ

2 голосов
/ 24 января 2011

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

...