2011-08-17 10 views
5

मेरे पास एक कतार है जिसका नाम check_integrity और इसमें बहुत सारी नौकरियां हैं। जब मैं इसके लिए एक कर्मचारी चलाता हूं तो पहले पहले ऑर्डर में नौकरियां लेती हैं। क्या उस विशेष कतार में नौकरियों को घुमाने में संभव है? मुझे मजदूरों को यादृच्छिक रूप से नौकरी लेने की जरूरत है। कृपया मदद करे।एक रेज्यू कतार में नौकरियों को कैसे घुमाएं?

धन्यवाद।

+0

मैंने इसे रीस्क-शेड्यूलर (github.com/bvandenbos/resque-scheduler) की देरी वाली नौकरियों की सुविधा का उपयोग करके कार्यान्वित किया। नौकरियां यादृच्छिक समय अंतराल पर लगाई गईं और मैं नौकरियों को घुमाने में सक्षम हूं। यहां कोड है। @values ​​= (1..60) .to_a। Resque.enqueue_at (Chronic.parse ("# {रैंड के बाद (@values ​​[@ values.size-1])} मिनट"), FetchSources, source_id)। आपके उत्तरों के लिए धन्यवाद। –

+0

क्या आप प्रश्न का उत्तर दे सकते हैं और फिर इसे सही उत्तर के रूप में चिह्नित कर सकते हैं, इसलिए इसे "उत्तर" के रूप में बंद कर दिया गया है? – rafb3

उत्तर

1

रेस्क्यू के लिए इस plugin पर देखें। मुझे लगता है कि यह वही है जो आपको चाहिए।

+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 

कि कोड के साथ initializers के अंदर एक फ़ाइल बनाने और आप सेट हो जाएगा।

0

एक तरह से इस बारे में जाने के लिए कतार से बाहर प्रविष्टियों पॉपिंग, उन्हें batching, बैच फेरबदल और फिर से है उन्हें फिर से सम्मिलित करें:

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 

यह वास्तव में उपयोगी होता है जब आप गलती से कई नौकरियां enqueue जो साझा संसाधनों, ताले और अन्य के लिए रेसिंग समाप्त होता है।