DrbとCelluloid
こんなコントローラがあったとします。
コレは、druby://localhost:8787
へ接続して、
receiverに対してメソッドを実行します。
# coding: utf-8 require 'drb/drb' require 'trema' # Simple Tap Controller. class Tap < Trema::Controller attr_accessor :switches def start info 'starting tap controller' @switches = [] @receiver = rpc_server end def switch_ready(datapath_id) info "connected: #{ datapath_id.to_hex }" @receiver.mailbox << datapath_id.to_hex send_message datapath_id, FeaturesRequest.new end def features_reply(datapath_id, features_reply) info "features_reply from: #{ datapath_id.to_hex }" @switches.push datapath_id.to_hex end private def rpc_server uri = "druby://localhost:8787" DRb.start_service DRbObject.new_with_uri(uri) end end
下記がreceiverの実装です。
druby://localhost:8787
で待ち受けています。
このコードを実行すると、mailboxに対して何かが入ったら、
receive loopの中を実行することができます。
require 'drb/drb' require 'celluloid' URI="druby://localhost:8787" # Message Receiver. class Receiver include Celluloid def initialize async.wait end def wait loop do message = receive{|msg| msg.is_a? String } puts "received: #{ message }" end end end DRb.start_service(URI, Receiver.new, :safe_level => 1) DRb.thread.join
今日はネットワーク越しのcelluloidを簡単にやってみました。
Tremaとmsgpack-rpc
仮にこんなコントローラがあったとします。
別のターミナルで以下を実行します
そうすると、tremaのinfoが呼ばれて、文字列が表示されます。 コントローラ側にも同じように表示されているのがわかります。 msgpack-rpcはお手軽でいいですね。