In my ruby script,I am using celluloid-zmq gem. where I am trying to run evaluate_response asynchronously inside pollers using,
async.evaluate_response(socket.read_multipart) 
But if I remove sleep from loop, somehow thats not working out, It is not reaching to "evaluate_response" method. But if I put sleep inside loop it works perfectly.
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!
Any idea why this is happening?
 
     
    