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。赛璐珞,不管......
答案 0 :(得分:1)
如果您可以在不同的端口上侦听,那么每个用户可以拥有一个服务器/端口。如果不是Ruby确实有一个可能对您有用的Queue对象:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/Queue.html用于将进程转移到其他线程。
答案 1 :(得分:0)
为什么不将回调中的工作移动到操作(因此,回调仅在处理数据时触发)或EM.defer调用?您不希望在主线程上进行繁重的数据处理,因为这会导致各种延迟。