Пойдите каналы в Ruby

На языке программирования Движения можно отправить сообщения вокруг использования конструкции под названием "Каналы". http://golang.org/doc/effective_go.html#channels

Я хотел бы использовать что-то как этот в Ruby, специально для IPC.

Псевдокод того, что я хочу:

channel = Channel.new

fork do
  3.times{ channel.send("foo ") }
  exit!
end

Thread.new do
  3.times{ channel.send("bar ") }
end

loop do
  print channel.recv
end

# ~> bar foo foo bar bar foo

Есть ли какая-либо конструкция, библиотека или эквивалент для Ruby, который работает как этот?

Если нет: Что лучший способ состоит в том, чтобы создать такую абстракцию?

ОБНОВЛЕНИЕ: разъяснить то, в чем я нуждаюсь от этих Каналов.

Один вариант использования: Некоторые разветвленные рабочие, ожидающие заданий. Они все читают из того же JobChannel и результатов отчета к тому же ResultChannel.

Каналы мне нужно

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

До сих пор я играл вокруг с

  • DRb, (противоположность легкого веса + замедляются + слишком много волшебства для моего небольшого мозга),
  • Сокеты, (UNIXSocket, TCPSocket... Сокеты, кажется, имеют много много способов использовать их. Я получил полурабочий канал на UNIXSockets. Если Вы думаете, что сокеты имеют смысл, на какое подмножество функций я должен посмотреть?)
  • Каналы. (Соединение больше чем 2 Процессов, кажется, нетривиально),

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

6
задан Julius Eckert 17 June 2010 в 18:24
поделиться

2 ответа

Идея Go о передаче сообщений по каналам как первоклассной конструкции действительно имеет смысл только при наличии параллелизма (горутины, тасклеты, как бы вы их ни называли). Благодаря дешевому параллелизму блокировка тасклета или сопрограммы больше не проблема, а блокировка передачи сообщений приобретает гораздо больший смысл.

Если бы это был Python, я бы указал вам на Stackless ; в Ruby, возможно, вам подойдет Revactor или NeverBlock ?

1
ответ дан 17 December 2019 в 22:10
поделиться

посмотрите этот вопрос: shared-variable-among-ruby-processes

а также посмотрите drb

Надеюсь, это немного поможет.

0
ответ дан 17 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: