2011-08-17 66 views
5

我有一個名爲check_integrity的隊列和大量的作業。當我爲它運行一個工作人員時,首先需要先做好工作。是否有可能在特定隊列中洗牌?我需要這位工人隨機採取工作。請幫忙。如何在Resque隊列中洗牌作業?

謝謝。

+0

我使用resque-scheduler(github.com/bvandenbos/resque-scheduler)的延遲作業功能實現了此功能。喬布斯按隨機時間間隔排隊,我可以洗牌。 這裏是代碼。 @values =(1..60).to_a。 Resque.enqueue_at(Chronic.parse(「在#{rand(@values [@ values.size-1])}分鐘」之後「,FetchSources,source_id)。 謝謝你的回答。 –

+0

你能回答這個問題,然後把它標記爲正確的答案,所以它被關閉爲「回答」? – rafb3

回答

1

看看這個plugin爲Resque。我想這正是你需要的。

+0

我不這麼認爲 - 這個插件隨機化隊列,而不是隊列中的作業。 –

+0

與這個插件,你可以添加重量 –

+0

隊列,而不是作業 –

0

如果你不介意的猴子修補resque那麼你可以使用此解決方案:如果使用的是軌道

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 

創建初始化中的文件與該代碼和你將被設置。去這個

0

一種方式是通過彈出的條目從隊列中,配料起來,洗牌批次,然後重新插入它們:

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 

這是非常有用的,當你錯誤地排隊多個作業最終爭奪共享資源,鎖等。