2011-08-17 11 views
5

Mam kolejkę o nazwie check_integrity i wiele zadań w nim. Kiedy uruchamiam dla niego pracownika, zajmuje pierwsze miejsce w pierwszej kolejności. Czy można przetasować zadania w tej konkretnej kolejce? Potrzebuję pracownika do losowego podjęcia pracy. Proszę pomóż.Jak przetasować zadania w kolejce Resque?

Dzięki.

+0

Zaimplementowałem to za pomocą funkcji opóźnionego zlecenia harmonogramu resque-scheduler (github.com/bvandenbos/resque-scheduler). Zadania są zapisywane w losowych odstępach czasu i mogę tasować zadania. Oto kod. wartości @ = (1..60) .to_a. Resque.enqueue_at (Chronic.parse ("after # {rand (@ wartości [@ values.size-1])} minutes"), FetchSources, source_id). Dziękuję wszystkim za odpowiedzi. –

+0

Czy potrafisz odpowiedzieć na pytanie, a następnie oznaczyć je jako właściwą odpowiedź, więc jest zamknięte jako "odpowiedział"? – rafb3

Odpowiedz

1

Spójrz na to plugin dla Resque. Sądzę, że to jest dokładnie to, czego potrzebujesz.

+0

Nie sądzę - ta wtyczka losuje kolejki, a nie zadania w kolejce. –

+0

z tą wtyczką można dodać wagę –

+0

do kolejek, nie do zadań –

0

Jeśli nie przeszkadza małpa łatanie Resque następnie można użyć tego rozwiązania:

module Resque 

    # Monkey patch Resque to handle queues as sets instead of lists. This allows 
    # use to get jobs randomly rather then sequentially. 
    def push(queue, item) 
    watch_queue(queue) 
    redis.sadd "queue:#{queue}", encode(item) 
    end 

    def pop(queue) 
    decode redis.spop("queue:#{queue}") 
    end 

    def size(queue) 
    redis.scard("queue:#{queue}").to_i 
    end 
end 

Jeśli używasz szyn utworzyć plik wewnątrz inicjalizatorów z tym kodem i zostaniesz ustawiony.

0

Jednym ze sposobów, aby go o to, by pojawiały wpisy z kolejki, Składowanie je, tasowanie partię, a następnie włóż je ponownie:

key = "resque:queue:bulk" 
total = Redis.current.llen(key) 
batch_size = 5_000 # any value that is good enough for you 

batch = [] 
total.times do |i| 
    entry = Redis.current.lpop(key) 
    batch << entry 
    if batch.size == batch_size 
    puts "re-inserting batch..." 
    Redis.current.rpush key, batch.shuffle 
    batch = [] 
    end 
end 

Jest to bardzo przydatne, gdy błędnie enqueue kilka miejsc pracy w efekcie wyścigi na wspólne zasoby, blokady i tak dalej.

Powiązane problemy