синхронизировать два сценария ruby ​​на одном компьютере - PullRequest
3 голосов
/ 13 февраля 2011

Как лучше всего синхронизировать два сценария ruby, запущенных на одном компьютере?

Сценарии будут запускаться как отдельные процессы из оболочки.

Я хочу, чтобы скрипты запускались по очереди. То есть я хочу, чтобы сценарий A выполнялся, отправлял сигнал сценарию B, затем ждал сигнала от сценария B. Когда сценарий B получает сигнал от сценария A, он запускается, сигнализирует сценарий A о завершении и затем ждет сигнала от A. В основном, я хочу, чтобы два сценария запускались с чередованием.

Какой лучший способ реализовать эту синхронизацию?

Сейчас все, что я могу придумать, - это создание файла в качестве сигнала (каждый скрипт занят циклами, ожидающими создания файла). Существуют ли другие реализации, которые быстрее / проще / безопаснее?

Если это повлияет на ответ, я нахожусь на OSX.

1 Ответ

2 голосов
/ 14 февраля 2011

Вероятно, самый простой способ сделать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...