Вероятно, самый простой способ сделать IPC в ruby - через drb и использовать Queue
, который находится в thread
:
require 'thread'
queue = Queue.new # provides blocking read
Обратите внимание, что при использовании drb в верхней части вашей программы должна быть указана следующая строка:
Socket.do_not_reverse_lookup=true;
Без этого дела идут очень медленно ( source ).
Чтобы решить конкретную проблему, описанную в этом вопросе, вы можете создать класс Pipe
, который по сути представляет собой всего два объекта Queue
, один для входящих и один для исходящих. Блокирующее чтение Queue
облегчает процессам, ожидающим друг друга. Pipe
распределяется между двумя процессами через drb
.
Код запуска сервера может выглядеть следующим образом:
require 'drb'
Socket.do_not_reverse_lookup=true;
uri = "druby://localhost:2250" # you can pick a port to communicate on
pipe = Pipe.new
DRb.start_service uri, pipe
Код запуска клиента будет выглядеть так:
require 'drb'
Socket.do_not_reverse_lookup=true;
uri = "druby://localhost:2250"
DRb.start_service
pipe = DRbObject.new nil, uri
Теперь клиент и сервер могут связываться через объект Pipe
.