2009-05-22 11 views
28

एक नया संसाधन बनाया जाता है और यह कुछ लंबा प्रसंस्करण करने की जरूरत है इससे पहले कि संसाधन के लिए तैयार है, मैं कैसे दूर पृष्ठभूमि में कि प्रसंस्करण भेजूँ जहां यह वर्तमान अनुरोध या अन्य धारण नहीं करेंगे जब मेरे वेब ऐप पर यातायात?रेल पर रूबी: पृष्ठभूमि में चीजें कैसे चलाएं?

अपने मॉडल में

:

class User < ActiveRecord::Base 
after_save :background_check 

protected 
def background_check 
    # check through a list of 10000000000001 mil different 
    # databases that takes approx one hour :) 
    if(check_for_record_in_www(self.username)) 
    # code that is run after the 1 hour process is finished. 
    user.update_attribute(:has_record) 
    end 
end 
end 

उत्तर

39

आप चाहिए निश्चित रूप से निम्नलिखित Railscasts की जाँच:

वे हर संभव में रेल में पृष्ठभूमि प्रक्रियाओं को चलाने के लिए तरीके की व्याख्या रास्ता (एक के साथ या बिना ueue ...)

+2

, सर्वाधिक उपयोग किए जाने/सबसे समर्थित विकल्प हैं [sidekiq] (https://github.com/mperham/sidekiq), [resque ] (https://github.com/defunkt/resque), और [देरी_job] (https://github.com/collectiveidea/delayed_job)। आईएमएचओ, साइडकीक उच्च-थ्रूपुट कतारों के लिए सबसे अच्छा है, और देरी_job बहुत कम थ्रूपुट के लिए सबसे अच्छा है। –

+0

एक और विकल्प है [आयरनवर्कर] (http://www.iron.io) यदि आप पृष्ठभूमि सेवा "सेवा के रूप में" चाहते हैं और सर्वर या कतार के विचार के बारे में चिंता करने की ज़रूरत नहीं है। आयरनएमक्यू/आयरनवर्कर ऑटो ऑटो रीट्रीज, टास्क लॉग, वेबहुक इत्यादि भी प्रदान करता है। यह रेल के साथ अच्छी तरह से एकीकृत करता है। यहां कुछ वीडियो दिए गए हैं: https://www.youtube.com/user/ironiodevelopers – Chad

7

एक अलग प्रक्रिया है, जो शायद सबसे आसानी से system के साथ किया है, एक 'nohup' prepending और आदेश आप इसे पारित के अंत करने के लिए एक '&' जोड़कर शुरू करो। (यकीन है कि आदेश सिर्फ एक स्ट्रिंग तर्क, नहीं तर्कों की सूची है।)

इसके कई कारण आप इसे इस तरह से करने के लिए है, बजाय, कहते हैं चाहते हैं, धागे का उपयोग करने की कोशिश कर रहे हैं:

  1. आई/ओ करने की बात आती है जब रूबी के धागे थोड़ा मुश्किल हो सकते हैं; आपको ध्यान रखना होगा कि कुछ चीजें जो आप करते हैं, पूरी प्रक्रिया को अवरुद्ध नहीं करती हैं।

  2. यदि आप एक अलग नाम के साथ एक प्रोग्राम चलाते हैं, तो यह आसानी से 'ps' में पहचाना जा सकता है, इसलिए आप गलती से नहीं सोचते कि यह एक फास्टसीजीआई बैक-एंड जंगली या कुछ चला गया है, और इसे मार डालो।

वास्तव में, प्रक्रिया आप शुरू "deamonized," किया जाना चाहिए मदद के लिए Daemonize वर्ग देखते हैं।

2

आप आदर्श रूप से अपना खुद का लिखने के बजाए मौजूदा पृष्ठभूमि जॉब सर्वर का उपयोग करना चाहते हैं। ये आम तौर पर आपको नौकरी जमा करने और इसे एक अनूठी कुंजी देने देंगे; फिर आप अपने वेबपैप को अवरुद्ध किए बिना नौकरी की स्थिति के लिए समय-समय पर जॉब सर्वर से पूछताछ करने के लिए कुंजी का उपयोग कर सकते हैं। here is a nice roundup वहां के विभिन्न विकल्पों में से।

0

के बारे में क्या:

def background_check 
    exec("script/runner check_for_record_in_www.rb #{self.username}") if fork == nil 
end 

कार्यक्रम "check_for_record_in_www.rb" फिर एक और प्रक्रिया में चलेंगे और ActiveRecord के लिए उपयोग होगा, डेटाबेस का उपयोग करने में सक्षम होने।

1

मुझे पृष्ठभूमिआरबी का उपयोग करना पसंद है, यह अच्छा है कि यह आपको लंबी प्रक्रियाओं के दौरान संवाद करने की अनुमति देता है। तो आपके पास अपने रेल ऐप

1

मुझे लगता है कि spawn आपकी प्रक्रिया को फोर्क करने, पृष्ठभूमि में कुछ प्रसंस्करण करने का एक शानदार तरीका है, और उपयोगकर्ता को केवल कुछ पुष्टि है कि यह प्रसंस्करण शुरू हो गया था।

6

मैं अभी 'देरी_बॉब' मणि के साथ प्रयोग कर रहा हूं क्योंकि यह हेरोकू होस्टिंग प्लेटफ़ॉर्म के साथ काम करता है और यह सेटअप करने के लिए हास्यास्पद रूप से आसान था !!

Gemfile, bundle install, rails g delayed_job को मणि जोड़ें, rake db:migrate फिर साथ एक कतार हैंडलर प्रारंभ करें;

RAILS_ENV=production script/delayed_job start 

कहाँ आप एक विधि कॉल जो अपनी लंबी प्रक्रिया है अर्थात

company.send_mail_to_all_users 

आप इसे करने के लिए बदल दिया है;

company.delay.send_mail_to_all_users 

चेक GitHub पर पूरी डॉक्स: https://github.com/collectiveidea/delayed_job

इन दिनों
संबंधित मुद्दे