Ruby ZeroMQ驱动服务器在一段时间后停止响应

Ruby ZeroMQ驱动服务器在一段时间后停止响应,ruby,eventmachine,zeromq,Ruby,Eventmachine,Zeromq,我正在研究如何将ZeroMQ与EventMachine一起使用。 为了进行测试,我用ruby(echo客户机服务器)编写了一个小程序,其中使用了XREQ和XREP套接字。客户机应用程序正在向服务器发送消息(连续数字),并立即将其返回。发送之间的间隔为0.1s。 一切正常。。。直到某个时刻。当当前的数字达到400左右时,服务器就会冻结,不再响应客户端。我在几台计算机上测试了这个,但仍然发现了那个奇怪的问题 代码非常简单: server.rb client.rb 请帮我找出原因 最后我发现这个问题只

我正在研究如何将ZeroMQ与EventMachine一起使用。 为了进行测试,我用ruby(echo客户机服务器)编写了一个小程序,其中使用了XREQ和XREP套接字。客户机应用程序正在向服务器发送消息(连续数字),并立即将其返回。发送之间的间隔为0.1s。 一切正常。。。直到某个时刻。当当前的数字达到400左右时,服务器就会冻结,不再响应客户端。我在几台计算机上测试了这个,但仍然发现了那个奇怪的问题

代码非常简单:

server.rb

client.rb


请帮我找出原因

最后我发现这个问题只在使用ruby 1.9.3p0时出现,所以感觉这是该版本ruby的一个bug。
使用ruby 1.9.2,一切都像一个魔咒一样工作。

垃圾收集器正在获取ZeroMQ上下文

您需要将调用移动到
EM::ZeroMQ::Context#new
EM
循环之外

require 'rubygems'
require 'bundler/setup'
require 'em-zeromq'

Thread.abort_on_exception = true

ADDRESS = 'tcp://127.0.0.1:2091'

class EMServerHandler
  attr_reader :received
  def on_readable(socket, messages)
    client_identity = messages.shift.copy_out_string #getting client identity from the 1st part of the message
    messages.shift #skip the delimeter
    messages.each do |m|
      msg = m.copy_out_string
      puts "server received from #{client_identity}: " + msg
      socket.send_msg("#{client_identity}",'',"#{msg}") #echo message back to the client
    end
  end
end

trap('INT') do
  EM::stop()
end

puts "Program started (with zmq #{ZMQ::Util.version.join('.')})."

EM.run do
EventMachine.epoll
  ctx = EM::ZeroMQ::Context.new(1)  
  server = ctx.bind(ZMQ::XREP, ADDRESS, EMServerHandler.new, {:identity => "server"})
end
require 'rubygems'
require 'bundler/setup'
require 'em-zeromq'

Thread.abort_on_exception = true

ADDRESS = 'tcp://127.0.0.1:2091'

class EMClientHandler
  attr_reader :received
  def on_readable(socket, messages)
    messages.shift #skip the delimeter
    messages.each do |m|
      puts "client recieved: " + m.copy_out_string
    end
  end
end

trap('INT') do
  EM::stop()
end

puts "Program started (with zmq #{ZMQ::Util.version.join('.')})."

EM.run do
  EventMachine.epoll
  ctx = EM::ZeroMQ::Context.new(1)
  puts "client"
  puts "enter client name >> "
  identity = gets.strip
  client = ctx.connect(ZMQ::XREQ, ADDRESS, EMClientHandler.new, {:identity => identity})
  client.send_msg('', "hello from client #{identity}")
  count = 0
  EM::PeriodicTimer.new(0.1) do
    client.send_msg('', "#{count += 1}")
  end
end