2014-11-11 26 views
5

'कनेक्शन अस्वीकृत' मैं इस सरल उदाहरण है:खुलने कई सूत्र त्रुटि

require 'watir-webdriver' 

arr = [] 
sites = [ 
"www.google.com", 
"www.bbc.com", 
"www.cnn.com", 
"www.gmail.com" 
] 

sites.each do |site| 
    arr << Thread.new { 
     b = Watir::Browser.new :chrome 
     b.goto site 
     puts b.url 
     b.close 
    } 
end 
arr.each {|t| t.join} 

हर बार जब मैं इस स्क्रिप्ट को चलाने, मैं

ruby/2.1.0/net/http.rb:879:in `initialize': Connection refused - connect(2) for "127.0.0.1"  port 9517 (Errno::ECONNREFUSED) 

या में से एक मिल ब्राउज़र थ्रेड के कम से कम एक पर अप्रत्याशित रूप से बंद हो जाता है।

दूसरी ओर

, अगर मैं हर पाश चक्र के अंत में sleep 2 निर्धारित करते हैं, सब कुछ सुचारू रूप से चलाता है! कोई विचार यह क्यों है?

कैसे समझ धागे काम करने के लिए संबंधित कुछ होना चाहिए ...

उत्तर

5

आप मूल रूप से आपके ब्राउज़र के उदाहरण के बीच एक रेस स्थिति बना रहे हैं खुला बंदरगाह watir-webdriver से कनेक्ट करने जा रहे हैं। इस मामले में, ब्राउज़र का आपका पहला उदाहरण देखता है कि पोर्ट 9517 खुला है और उससे जुड़ता है। क्योंकि आप समानांतर में इन उदाहरणों अप कताई रहे हैं, आपके दूसरे उदाहरण भी सोचता है कि बंदरगाह 9517 खुला है और कनेक्ट करने के लिए कोशिश करता है। लेकिन ओह, उस पोर्ट का पहले से ही पहले ब्राउज़र उदाहरण द्वारा उपयोग किया जा रहा है। यही कारण है कि आपको यह विशेष त्रुटि मिलती है।

और इसी कारण sleep 2 फिक्स मुद्दा बताते हैं। पहला ब्राउज़र उदाहरण पोर्ट 9517 से जुड़ता है और नींद दूसरे ब्राउजर इंस्टेंस को यह देखने के कारण बनाती है कि 9517 लिया गया है। यह तो बंदरगाह 9518.

संपादित

आप देख सकते हैं कि यह कैसे Selenium::WebDriver::Chrome::Service#initialize (here) के साथ लागू किया जाता है, जो Selenium::WebDriver::PortProber (here) कॉल पर जोड़ता है। पोर्टपोर्बर यह है कि वेबड्राइवर यह निर्धारित करता है कि कौन सा बंदरगाह खुला है।

+0

धन्यवाद। अब यह स्पष्ट है। – MichaelR

+0

तो मैं इसी तरह की स्थिति में चल रहा है, जबकि मैं वेबसाइटों को क्रॉल कर रहा हूँ, और जब मैं उस पर भी कई कार्यकर्ताओं फेंक, मैं एक ही त्रुटियों हो रही शुरू करते हैं। ब्राउज़र और खुले बंदरगाह के बीच प्रारंभिक कनेक्शन को "सुरक्षित" करने का कोई तरीका है, ताकि यह सुनिश्चित किया जा सके? धीमे होने के कारण कोई समस्या नहीं है, लेकिन जब मैं एक विशाल कतार है और प्रत्येक नौकरी को पूरा करने में कितना समय लगता है, तो वह काम नहीं करेगा .. अनिवार्य रूप से, मैं इस समस्या में पड़ जाऊंगा .... – kindofgreat

+0

I अनुमान लगाएं कि मैं ब्राउज़र को खुले और नए यूआरएल पर जा सकता हूं, प्रत्येक यूआरएल के लिए ब्राउजर इंस्टेंस खोलने और बंद करने के बाद। तो फिर मेरे पास समवर्ती श्रमिकों की एक निश्चित संख्या हो सकती है, 10 कहें, और चीजों को शुरू करने के लिए उन 10 के बीच पर्याप्त नींद की अवधि हो, तो मजदूर उन दस श्रमिकों के भीतर उदाहरण हैं। काफी के रूप में सुंदर नहीं है, और थोड़ा और अधिक जटिल पैमाने पर करने के ... – kindofgreat

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