【发布时间】: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 之间的混合体。我相信奥卡姆也可能产生了影响。