我在我的Sinatra服务器上使用Ruby的Queue将任务发送到工作线程然后处理它们并将它们保存在我选择的数据库中。其中一个数据库恰好是Redis,它支持some really cool pipelinening。
我的问题是:有没有办法修改Queue类,以便.pop
可以一次弹出多个项目,例如正常Array#pop
,àla[1,2,3,4,4,5].pop(3)
,这样我可以管道结果吗?
此外,如果队列变得太大,Heroku实例会发生什么?警告和重启 - 一些丢失的数据,对吗?
答案 0 :(得分:3)
怎么样:
def pop_queue(q, n)
ary = []
n.times { ary << q.pop }
ary
end
您不希望猴子修补核心库。如果其他代码调用它并且不知道arity或参数类型的变化,那么整个应用程序将会爆炸。
...如果你的数据太大了?你是程序员。难道你不应该采取防御措施来避免这种情况吗?
如果您有可能使用所有可用空间的情况,那么请编写代码以避免占用RAM,而是使用数据库。至少使用基于磁盘的SQLite数据库和类似Sequel的数据库进行通信。
数据库的美妙之处在于多个线程可以与它交谈,只是不要读写同一行。某些DBM支持行锁定,而其他DBM支持表锁定。您必须编写代码才能利用这一点并将表视为队列。如果你想获得最佳性能,可以使用消息队列,比如AMQP或RabbitMQ而不是数据库,但是这开始谈论更复杂的代码和更大的托管铁。