2015-03-09 5 views
7

पर बुलाया गया है, मैं एक रेल ऐप में एक छोटी सी विशेषता लिखने की कोशिश कर रहा हूं जो random-word gem का उपयोग यादृच्छिक संज्ञा उत्पन्न करने के लिए करता है, फिर इसे बहुवचन करें। मैं पहली बार विकास में पेज पर जाने के लिए इसे काम करने में सक्षम हूं, लेकिन मैं चाहता हूं कि प्रत्येक पेज लोड पर स्क्रिप्ट फिर से चलें। अभी, बाद के पेज लोड (जब तक मैं सर्वर को उछाल नहीं देता) मुझे FiberError in WelcomeController#randomwords, fiber called across threads दें। मैंने इसे स्वयं हल करने का प्रयास किया, लेकिन मैं प्रोग्रामिंग के लिए काफी नया हूं और वास्तव में समझ नहीं पा रहा हूं कि फाइबर कैसे काम करते हैं। मैंने कतार का उपयोग करने की कोशिश की, लेकिन यह पता नहीं लगा कि इसे कैसे काम करना है, फिर से क्योंकि मैं कक्षा को पूरी तरह से समझ नहीं पा रहा हूं। मैं इस विशिष्ट समस्या को हल करने के बारे में कैसे जाउंगा?फाइबर त्रुटि - फाइबर को

स्रोत: welcome_helper.rb

def random 
    noun = RandomWord.nouns.next.split('_').sample.pluralize 
    if noun.include? "_" 
    noun = noun.split("_").join.pluralize 
    else 
    noun.pluralize! 
    end  
    return noun 
end 

उत्तर

1

समस्या, जैसा कि आप अब तक पता चला हो सकता है, कि random-word मणि सुरक्षित थ्रेड नहीं है। अधिक सटीक, RandomWord.nouns एक module-level Enumerator है, और accessing enumerators across threads is not safe

हालांकि, उदा। Queue धागा सुरक्षित है, इसलिए इस कार्यक्षमता के लिए थ्रेड-सुरक्षित विकल्प के लिए आप nouns.dat from the random-word gem ले सकते हैं, और जब आप अपना एप्लिकेशन प्रारंभ करते हैं तो अपने सभी शब्दों को Queue ऑब्जेक्ट में यादृच्छिक रूप से घुमाएं। अब, यह कतार random_words_queue के माध्यम से random विधि के दायरे में पहुंचा जा सकता है। तो फिर तुम के रूप में

def random 
    unless random_words_queue.empty? 
    noun = random_words_queue.pop 
    if noun.include? "_" 
     noun = noun.split("_").join.pluralize 
    else 
     noun.pluralize! 
    end  
    return noun 
    end 
end 

नोट random विधि लागू कर सकते हैं कि यह वर्तमान में सिर्फ nil लौटाता है यदि कतार खाली है, जो शायद आप नहीं चाहते हैं। आप इसे कैसे इस मामले में व्यवहार करने के लिए चाहते हैं अपनी आवश्यकताओं पर निर्भर करता है:

  • शब्द कुछ हद तक उम्मीद के मुताबिक किया जा रहा है एक सुरक्षा चिंता का विषय अपने उपयोगकर्ताओं को परेशान होने की संभावना नहीं है, और नहीं है, तो मैं सिर्फ noun के पीछे से धक्का होगा इसे पॉप करने के बाद कतार सही है।
  • अन्यथा, आपको शब्दों को दोबारा बदलना चाहिए।

(किसी भी मामले में, nil लौटने शायद क्या किसी को चाहता है नहीं है।)

संबंधित मुद्दे