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

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 в блокирующем режиме.