Перейти каналы в Ruby - PullRequest
6 голосов
/ 17 июня 2010

На языке программирования Go вы можете отправлять сообщения, используя конструкцию, называемую «Каналы».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.

Каналы, которые мне нужны

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

До сих пор я играл с

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

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

Ответы [ 4 ]

1 голос
/ 17 июня 2010

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

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

0 голосов
/ 03 октября 2014

Cod - это драгоценный камень для IPC с использованием каналов.

0 голосов
/ 06 сентября 2014

Gem агента оформления заказа, его синтаксис близок к тому, что вы хотите: https://github.com/igrigorik/agent

0 голосов
/ 17 июня 2010

проверьте этот вопрос: shared-variable-Среди-ruby-процессов

, а также проверьте drb

Надеюсь, это поможетбит.

...