/ / Existuje alternatíva k frontu, ktorá vám umožňuje .pop viac ako jeden výsledok naraz? - rubín, redis, fronta, sinatra

Existuje alternatíva k frontu, ktorá vám umožňuje viac ako jeden výsledok naraz? - rubín, redis, fronta, sinatra

Používam Ruby fronta na mojom serveri Sinatra, aby som poslal úlohy do pracovného vlákna, aby sa s nimi vysporiadal a uložil ich do databázy podľa môjho výberu. Jednou z databáz sa stalo Redis, ktorá podporuje niektoré skutočne skvelé potrubia.

Moja otázka znie: existuje spôsob, ako upraviť triedu frontu tak, že .pop môže zobraziť naraz viac ako jednu položku ako zvyčajne Array#pop, la [1,2,3,4,4,5].pop(3), aby som mohol získať výsledky?

Čo sa stane s inštanciou Heroku, ak sa fronta stane príliš veľkou? Varovanie a reštart - niektoré stratené údaje, správne?

odpovede:

3 pre odpoveď č. 1

Čo tak:

def pop_queue(q, n)
ary = []
n.times { ary << q.pop }
ary
end

Nechcete opaľovať jadro knižnice. Ak to volá iný kód a nevie sa o zmene arity alebo typu parametra, vaša celková aplikácia vyhodí do povetria.

... ak sú vaše údaje príliš veľké? Ste programátor. Nemáte programovať defenzívne, aby ste sa takýmto situáciám vyhli?

Ak máte možnú situáciu, kde by ste mohlivyužite všetok dostupný priestor, potom napíšte kód, aby nenasal RAM a namiesto toho použil databázu. Minimálne použite databázu SQLite založenú na disku a podobne pokračovanie hovoriť s tým.

Krása databázy je viac vlákien môžeporozprávajte sa s ním, jednoducho nečítajte a nezapisujte do toho istého riadku. Niektoré DBM podporujú uzamykanie riadkov a iné podporujú uzamykanie tabuliek. Aby ste mohli využiť túto výhodu, musíte napísať svoj kód a zachádzať s tabuľkou ako s frontom.

Ak chcete dosiahnuť najlepší výkon, použite namiesto databázy fronty správ, napríklad AMQP alebo RabbitMQ, ale to začína hovoriť o zložitejších kódoch a väčšej hostiteľskej železe.