Ruby中的Go通道

8
在Go编程语言中,可以使用称为“通道(Channels)”的构造来发送消息。 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上得到了一个半工作的通道。如果您认为套接字有意义,那么应该查看哪些功能子集?); -Pipes(连接超过2个进程似乎并不容易)。
如果其中任何一个已经是解决我的问题的完美技术,请提供教程等,其中包含更专注于我的要求的信息。

这是类似于管道或共享内存的东西吗?你需要这样的东西有什么目的?这个通道似乎既发送信息又接收信息? - Rishav Rastogi
@Rishav Rastogi:不,Go通道更像是通道。 Go的通道基于Newsqueak的通道(毫不奇怪,因为Newsqueak是由Rob Pike设计的),而Newsqueak的通道则是CSP通道(显然是后来的版本,而不是原始版本)和π-Calculus通道的混合体。 我相信Occam也可能会产生影响。 - Jörg W Mittag
4个回答

1

Go语言通过通道进行消息传递的想法,作为一种一等公民的构造,在并发存在的情况下才真正有意义(goroutines、tasklets或者你想叫它们什么都可以)。有了廉价的并发,阻塞一个任务或协程就不再是问题,阻塞消息传递开始变得更加合理。

如果这是Python,我会向您指出Stackless;在Ruby中,也许RevactorNeverBlock适合您?


谢谢。所有这些并发概念对我来说都是相当新的。演员可能会解决我正在寻找的问题。 对于Ruby 1.8,我将尝试Omnibus库。http://github.com/mental/concurrent - Julius Eckert
该死,Omnibus演员生成为绿色线程。他们有一个消息传递的概念,称之为“邮箱”。我想要正好那个邮箱,以便在多个进程中使用。 - Julius Eckert

0

Cod 是一个使用通道进行进程间通信的宝石。


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接