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 频道的主要内容,如果未能解决你的问题,请参考以下文章

在 go 中输入不可知的频道

何时关闭频道[重复]

go-runtime 不会将对象推出缓冲通道

接受任何频道的 go 函数

如何在循环中创建频道?

Go 中的垃圾收集和指针的正确使用