在我的ruby脚本中,我使用了celluloid-zmq gem。这里我想里面使用轮询evaluate_response异步运行,在轮询器内部异步运行代码
async.evaluate_response(socket.read_multipart)
但是,如果我从环去除睡眠,不知何故那不是工作了,它不伸手“evaluate_response”的方法。但是如果我把睡眠放在循环内,它可以完美地工作
require 'celluloid/zmq'
Celluloid::ZMQ.init
module Celluloid
module ZMQ
class Socket
def socket
@socket
end
end
end
end
class Indefinite
include Celluloid::ZMQ
## Readers
attr_reader :dealersock,:pullsock,:pollers
def initialize
prepare_dealersock and prepare_pullsock and prepare_pollers
end
## prepare DEALER SOCK
def prepare_dealersock
@dealersock = DealerSocket.new
@dealersock.identity = "IDENTITY"
@dealersock.connect("tcp://localhost:20482")
end
## prepare PULL SOCK
def prepare_pullsock
@pullsock = PullSocket.new
@pullsock.connect("tcp://localhost:20483")
end
## prepare the Pollers
def prepare_pollers
@pollers = ZMQ::Poller.new
@pollers.register_readable(dealersock.socket)
@pollers.register_readable(pullsock.socket)
end
def run!
loop do
pollers.poll ## this is blocking operation never mind though we need it
pollers.readables.each do |socket|
## we know socket.read_multipart is blocking call this would give celluloid the chance to run other process in mean time.
async.evaluate_response(socket.read_multipart)
end
## If you remove the sleep the async evaluate response would never be executed.
## sleep 0.2
end
end
def evaluate_response(message)
## Hmmm, the code just not reaches over here
puts "got message: #{message}"
...
...
...
...
end
end
## Code is invoked like this
Indefinite.new.run!
任何想法为什么会发生这种情况?
为什么你根本定义'Celluloid :: ZMQ :: Socket.socket'? – digitalextremist
我用代码更新了问题。 –
我更新了我的答案。 – digitalextremist