Ruby 中的 Go 频道
Posted
技术标签:
【中文标题】Ruby 中的 Go 频道【英文标题】:Go Channels in Ruby 【发布时间】:2011-03-04 23:32:21 【问题描述】:在 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,(与轻量级相反 + 慢 + 对我的小大脑来说太多魔法) Sockets, (UNIXSocket, TCPSocket ... Sockets 似乎有很多使用它们的方法。我在 UNIXSockets 上找到了一个半工作的频道。如果你认为 sockets 有意义,我应该看看哪些功能子集在?) 管道。 (连接超过 2 个进程似乎很重要)如果其中任何一个已经是解决我的问题的完美技术,请提供教程等,其中包含更多关于我的需求的集中信息。
【问题讨论】:
这类似于管道还是共享内存?你需要这样的东西有什么目的。似乎是在发送信息并自己接收信息的渠道? @Rishav Rastogi:不,Go Channels 更像是 Channels。 Go 的 Channels 基于 Newsqueak 的 Channels(毫不奇怪,因为 Newsqueak 是由 Rob Pike 设计的),而后者又是 CSP Channels(显然不是原来的版本)和 π-Calculus Channels 之间的混合体。我相信奥卡姆也可能产生了影响。 【参考方案1】:Go 的通过通道传递消息的想法,作为一种一流的构造,只有在并发(goroutines、tasklet,无论你想怎么称呼它们)的情况下才真正有意义。使用廉价的并发,阻塞 tasklet 或协程不再是问题,阻塞消息传递开始变得更有意义。
如果这是 Python,我会把你指向Stackless;在 Ruby 中,Revactor 或 NeverBlock 可能适合您?
【讨论】:
谢谢。所有这些并发概念对我来说都是相当新的。演员可能会解决我正在寻找的东西。对于 Ruby 1.8,我将尝试 Omnibus 库。 github.com/mental/concurrent 该死,综合演员生成为绿色线程。他们有一个消息传递的概念,他们称之为“邮箱”。我想要那个邮箱只是为了在多个进程中使用。【参考方案2】:看看这个问题: shared-variable-among-ruby-processes
还可以查看drb
希望对你有所帮助。
【讨论】:
【参考方案3】:结帐代理 gem,它的语法与您的语法接近:https://github.com/igrigorik/agent
【讨论】:
【参考方案4】:Cod 是使用通道的 IPC 的 gem。
【讨论】:
以上是关于Ruby 中的 Go 频道的主要内容,如果未能解决你的问题,请参考以下文章