Forum: Ruby Queue/IO blocking in threads

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Martin C. (Guest)
on 2009-03-03 20:52
I am coding a client/server in which requests and responses are handled
on the client and server side by threads communicating with Queues
(because several sessions will share one connection to the server).

In the code below, I expect the client and server to exchange the same
message indefinitely, but between reading the queues and IO, it blocks
somewhere. it doesn't get further than printing the first request.

require 'gserver'
require 'socket'
require 'zlib'
require 'yaml'

class ConnectionHandler
  def initialize(io)
    queue = Queue.new
    request_handler = Thread.new do
      loop do
        req = io.gets("__EOF__").chomp("__EOF__")
        puts "client request: #{req}"
        queue << "speak your request, my child"
      end
    end

    response_handler = Thread.new do
      loop do
        res = queue.pop
        socket << res << "__EOF__"
      end
    end

    request_handler.join
    response_handler.join
  end
end

class MyServer < GServer
  def initialize(port=10001, *args)
    super(port, *args)
  end
  def serve(io)
    ConnectionHandler.new(io)
  end
end

# Start the server
server = MyServer.new
server.audit = true
server.start

# Here follows the client implementation:
socket = TCPSocket.new('localhost', 10001)
cqueue = Queue.new
request_processor = Thread.new {
  loop do
    req = cqueue.pop
    socket << req << "__EOF__"
  end
}

response_processor = Thread.new {
  loop do
    res = socket.gets("__EOF__").chomp("__EOF__")
    puts "server response: #{res}"
    cqueue << "enquiring minds want to know"
  end
}

# This message will start off the conversation
cqueue << "can i speak freely?"

server.join
request_processor.join
response_processor.join
Martin C. (Guest)
on 2009-03-03 21:15
I am very sorry; I just realized that in the response_handler thread I
was writing to "socket" instead of "io". I was actually just trying to
present a simplification of the problem I am having with my real
project. Arrgh! Now to go sift through all the lines of code to see if I
can get the real thing to work...
This topic is locked and can not be replied to.