Ruby:EventMachine和单独的回调队列

时间:2013-03-06 13:32:27

标签: ruby multithreading callback eventmachine

EventMachine在一个主线程中执行单独线程中的所有操作以及此操作的所有回调。当您需要降低数据部分之间的数据处理竞争力时,这非常有用。您可以从网络concurent接收数据并处理队列中的结果。但我还需要更进一步。我的网站上有很多用户,并希望为每个用户单独排队。因此它应该像每个用户的单个EM一样。但我不能。 EventMachine是单身人士。

Thread.new do
  EM.run
end

def request_from_user
  operation = Proc.new {
    # network request
  }
  callback = Proc.new {
    # some heavy data processing
    2*2
  }
  5.times do
    EM.defer(operation, callback)
  end
end

3.times do
  request_from_user
end

所以我们在mainthread队列中有回调混乱。有些数据会在队列末尾处理,有些数据会在中间处理,而且很糟糕。重载将扩大队列,一些用户将收到非常大的延迟结果。如果我在单线程中运行request_from_user,则无论如何都将在一个EM主线程中执行回调。

那我该怎么办呢?是否可以为每个用户创建单独的回调队列,并执行它是否是concurent?甚至可以没有EventMachine。赛璐珞,不管......

2 个答案:

答案 0 :(得分:1)

如果您可以在不同的端口上侦听,那么每个用户可以拥有一个服务器/端口。如果不是Ruby确实有一个可能对您有用的Queue对象:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/Queue.html用于将进程转移到其他线程。

答案 1 :(得分:0)

为什么不将回调中的工作移动到操作(因此,回调仅在处理数据时触发)或EM.defer调用?您不希望在主线程上进行繁重的数据处理,因为这会导致各种延迟。