Ruby中的Go频道

Ruby中的Go频道,ruby,ipc,go,channels,Ruby,Ipc,Go,Channels,在Go编程语言中,您可以使用一种称为“通道”的结构发送消息。 我很想在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

在Go编程语言中,您可以使用一种称为“通道”的结构发送消息。

我很想在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

我需要的频道

  • 速度很快,
  • 写入不阻塞,(消息发送)
  • 读取do块(消息接收)
  • 分叉前不需要特殊处理
  • 轻巧和简单就好了
到目前为止,我和他一起玩

  • DRb,(对我的小脑袋来说,轻量+慢+太多魔法的反面)
  • Sockets,(UNIXSocket,TCPSocket…Sockets似乎有很多种使用它们的方法。我在UNIXSockets上有一个半工作通道。如果你认为Sockets有意义,我应该看看哪些功能子集?)
  • 管道。(连接两个以上的进程似乎很重要)
如果其中任何一项已经是解决我问题的完美技术,请提供教程等,其中有更多关于我的要求的重点信息。

查看此问题:

同时也要检查一下


希望能有所帮助。

Go关于通过通道传递消息的想法,作为一种一流的构造,只有在存在并发性的情况下才有意义(goroutines、tasklet,不管你怎么称呼它们)。使用廉价的并发性,阻止tasklet或协同路由不再是问题,阻止消息传递开始变得更有意义


如果这是Python,我会告诉你;在Ruby中,或者适合您?

签出代理gem,它的语法与您所说的非常接近:

是IPC使用通道的gem。

这类似于管道还是共享内存?。你为什么需要这样的东西。这个频道似乎在发送信息并接收信息?@Rishav Rastogi:不,Go频道更像是,嗯,像频道。Go的频道是基于Newsquak的频道(毫不奇怪,因为Newsquak是由Rob Pike设计的),而Newsquak的频道又是CSP频道(显然是后来的版本,不是原来的版本)和π演算频道的混合。我相信奥卡姆也有影响力。谢谢。所有这些并发概念对我来说都是相当新的。演员可能会解决我要找的问题。对于Ruby 1.8,我将尝试使用Omnibus库。该死,综合演员就像绿线一样繁殖。他们有消息传递的概念,他们称之为“邮箱”。我想要的正是那个邮箱,它可以跨多个进程使用。