2009-08-28 2 views
0

Мне нужно иметь 2 (или, возможно, 3) непрерывно выполняемых «грануса» программы в Ruby - поток связи, поток рендеринга и, возможно, кеширующий поток.Темы или DRb?

Идея потока рендеринга показывает слайд-шоу (определение которого читается из файла), а все слайды извлекаются с удаленного HTTP-сервера по потоку связи. Отрисовка должна быть непрерывной и без остановок (отсюда вероятная необходимость кэширования). Файл может меняться в течение всей жизни программы и, следовательно, необходимо повторно разбор (на лету).

Я бы хотел послать сообщения между «гранями», например, когда поток коммитов получает целую «главу» шоу, поток рендеринга можно запустить, прежде чем ждать, пока все шоу будет загружено, например, и так на.

Должен ли я использовать потоки Ruby или DRb? Как передать сообщения между потоками?

Благодарим за отзыв!

ответ

2

Держите его простым для начала - всегда лучший совет. Начните с двух потоков и посмотрите, соответствует ли производительность. Вы можете использовать переменную условия или простые мьютексы, чтобы синхронизировать список извлеченных глав. Возможно, вы столкнетесь с проблемой недогрузки - нет никакой главы для рендеринга, но вы, по крайней мере, будете иметь кости работоспособного решения, используя не что иное, как основной Ruby.

Тогда непременно посмотрите на решения, предлагающие другие возможности. Помимо DRb, вы также должны посмотреть EventMachine (для асинхронных возможностей, которые могут понадобиться при чтении разделов) и RabbitMQ для более общего и более слабого соединения, которое предлагает система обмена сообщениями.

Начните с малого и не пытайтесь двигаться слишком быстро. Для всех, кто имеет проблемы с потоками Ruby, я запускаю небольшой клиент рендеринга отчетов, который прослушивает очередь RabbitMQ. Клиент использует четыре потока для рендеринга (google) графиков, отправки предупреждений и автоматического сброса различных очередей (после нескольких часов сбора данных). Все отлично работает!

Chris

+0

Я рассматриваю только DRb из-за возможностей передачи сообщений - я не могу иметь это с потоками ... правильно? Я имею в виду, я могу взломать его с помощью мьютексов, но это все еще взлом ... верно? :) DRb кажется намного проще. –

+0

Вам действительно нужна система передачи сообщений, если вам нужно несколько процессов. Это не похоже на то, что вам нужно несколько процессов, поэтому я бы рекомендовал сохранить его простым. Я делаю что-то похожее на себя (собираю удаленные данные, обрабатываю их и выдаю вывод), и простая система потоковой обработки будет работать отлично - у меня есть поток для каждого этапа и один дополнительный поток - нет необходимости в DRb. Но используйте то, что считаете нужным! Удачи! –

+0

IMHO, предложение RabbitMQ - правильный путь. Раньше я делал такие вещи как с DRb, так и с RabbitMQ, а решение DRb было менее идеальным. RabbitMQ на порядок быстрее, и если вы используете библиотеку Bunny celldee, это также намного проще. –

Смежные вопросы