2011-08-17 24 views
5

Tôi có một hàng đợi có tên là check_integrity và rất nhiều công việc trong đó. Khi tôi chạy một công nhân cho nó nó có công việc đầu tiên trong lần đầu tiên ra lệnh. Có thể trộn các công việc trong hàng đợi cụ thể đó không? Tôi cần công nhân làm việc ngẫu nhiên. Hãy giúp tôi.Làm thế nào để xáo trộn công việc trong hàng đợi Resque?

Cảm ơn.

+0

Tôi đã triển khai tính năng này bằng cách sử dụng tính năng công việc bị trì hoãn của trình lập lịch biểu resque (github.com/bvandenbos/resque-scheduler). Công việc enqueued tại khoảng thời gian ngẫu nhiên và tôi có thể shuffle công ăn việc làm. Đây là mã. @values ​​= (1..60) .to_a. Resque.enqueue_at (Chronic.parse ("sau # {rand (@values ​​[@ values.size-1])} phút"), FetchSources, source_id). Cảm ơn tất cả các câu trả lời của bạn. –

+0

Bạn có thể trả lời câu hỏi và đánh dấu câu hỏi đó là câu trả lời đúng để câu trả lời được trả lời là "đã trả lời" không? – rafb3

Trả lời

1

Hãy xem điều này plugin cho Resque. Tôi đoán đây là chính xác những gì bạn cần.

+0

Tôi không nghĩ vậy - plugin này ngẫu nhiên xếp hàng đợi, chứ không phải công việc trong hàng đợi. –

+0

với plugin này bạn có thể thêm trọng lượng –

+0

vào hàng đợi, không phải công việc –

-2

bạn có thể sử dụng Delayed_job

+0

Điều này không trả lời được câu hỏi – rafb3

0

Nếu bạn không nhớ khỉ vá resque sau đó bạn có thể sử dụng giải pháp này:

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 

Nếu đang sử dụng đường ray tạo ra một tập tin bên trong initializers với mã đó và bạn sẽ được thiết lập.

0

Một cách để đi về việc này là bởi popping mục ra khỏi hàng đợi, Trạm trộn chúng lên, xáo trộn hàng loạt và sau đó tái chèn chúng:

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 

Điều này thực sự hữu ích khi bạn nhầm lẫn enqueue một số công việc mà kết thúc cuộc đua cho các tài nguyên được chia sẻ, ổ khóa và như vậy.

Các vấn đề liên quan