7

在 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。

我需要的频道

  • 非常快,
  • 写入不阻塞,(消息发送)
  • 读取做块,(消息接收)
  • 分叉前不需要特殊处理,
  • 轻量级和简单会很好。

到目前为止,我玩过

  • DRb,(对我的小脑袋来说,轻量级 + 慢 + 太多魔法相反)
  • 套接字,(UNIXSocket、TCPSocket ...套接字似乎有很多使用它们的方法。我在 UNIXSockets 上获得了一个半工作通道。如果您认为套接字有意义,我应该查看哪些功能子集?)
  • 管道。(连接超过 2 个进程似乎并不简单)

如果其中任何一个已经是解决我的问题的完美技术,请提供教程等,其中包含更多关于我的要求的集中信息。

4

4 回答 4

1

Go 的通过通道传递消息的想法,作为一流的构造,只有在存在并发(goroutines,tasklet,无论你愿意如何称呼它们)的情况下才真正有意义。使用廉价的并发,阻塞 tasklet 或协程不再是问题,阻塞消息传递开始变得更有意义。

如果这是 Python,我会指给你Stackless;在 Ruby 中,RevactorNeverBlock可能适合您吗?

于 2010-06-17T18:57:29.537 回答
0

看看这个问题: shared-variable-among-ruby-processes

并查看drb

希望它有点帮助。

于 2010-06-17T15:00:50.697 回答
0

结帐代理 gem,它的语法与您的语法接近:https ://github.com/igrigorik/agent

于 2014-09-06T19:43:35.820 回答
0

Cod是使用渠道的 IPC 的瑰宝。

于 2014-10-03T06:41:34.500 回答