Книга: Программирование на языке Ruby

10.1.15. Неблокирующий ввод/вывод

10.1.15. Неблокирующий ввод/вывод

«За кулисами» Ruby предпринимает согласованные меры, чтобы операции ввода/вывода не блокировали выполнение программы. В большинстве случаев для управления вводом/выводом можно пользоваться потоками — один поток может выполнить блокирующую операцию, а второй будет продолжать работу.

Это немного противоречит интуиции. Потоки Ruby работают в том же процессе, они не являются платформенными потоками. Быть может, вам кажется, что блокирующая операция ввода/вывода должна приостанавливать весь процесс, а значит, и все его потоки. Это не так — Ruby аккуратно управляет вводом/выводом прозрачно для программиста.

Но если вы все же хотите включить неблокирующий режим ввода/вывода, такая возможность есть. Небольшая библиотека io/nonblock предоставляет методы чтения и установки для объекта IO, представляющего блочное устройство:

require 'io/nonblock'
# ...
test = mysock.nonblock? # false
mysock.nonblock = true  # Отключить блокирующий режим.
# ...
mysock.nonblock = false # Снова включить его.
mysock.nonblock { some_operation(mysock) }
# Выполнить some_operation в неблокирующем режиме.
mysock.nonblock(false) { other_operation(mysock) }
# Выполнить other_operation в блокирующем режиме.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.708. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз