7

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のコンストラクト、ライブラリ、または同等のものはありますか?

そうでない場合: そのような抽象化を構築する最善の方法は何ですか?

更新:これらのチャネルから必要なものを明確にするため。

ユース ケースの 1 つ: フォークされた一部のワーカーがジョブを待っています。それらはすべて同じ JobChannel から読み取り、結果を同じ ResultChannel に報告します。

必要なチャンネル

  • 非常に高速で、
  • 書き込みはブロックされません(メッセージ送信)
  • reads do block (メッセージ受信)
  • フォークする前に特別な処理は必要ありません。
  • 軽くてシンプルなところがいいです。

これまでのところ、私は遊んでいました

  • DRb、(私の小さな脳には軽量+遅い+魔法が多すぎるの反対)
  • ソケット(UNIXSocket、TCPSocket ... ソケットにはさまざまな使用方法があるようです。UNIXSockets で半分しか機能しないチャネルを取得しました。ソケットが理にかなっているとお考えの場合は、機能のどのサブセットを見ればよいでしょうか?)
  • パイプ。(2つ以上のプロセスを接続することは自明ではないようです)

それらのいずれかがすでに私の問題に最適なテクノロジである場合は、私の要件に焦点を当てた情報を含むチュートリアルなどを提供してください。

4

4 に答える 4

1

Go's idea of message passing via channels, as a first-class construct, really only makes sense in the presence of concurrency (goroutines, tasklets, whatever you'd care to call them). With cheap concurrency, blocking a tasklet or coroutine is no longer a problem, and blocking message passing starts to make a lot more sense.

If this were Python, I'd point you at Stackless; in Ruby, perhaps Revactor or NeverBlock fit the bill for you?

于 2010-06-17T18:57:29.537 に答える
0

この質問をチェックしてください: shared-variable-among-ruby-processes

また、 drbもチェックしてください

それが少し役立つことを願っています。

于 2010-06-17T15:00:50.697 に答える
0

Codはチャネルを使用した IPC 用の gem です。

于 2014-10-03T06:41:34.500 に答える
0

チェックアウト エージェント ジェム。目的に近い構文を持っています: https://github.com/igrigorik/agent

于 2014-09-06T19:43:35.820 に答える