2010-11-09 13 views
6
import threading 
import Queue 
import urllib2 
import time 

class ThreadURL(threading.Thread): 

    def __init__(self, queue): 
     threading.Thread.__init__(self) 

     self.queue = queue 

    def run(self): 
     while True: 
      host = self.queue.get() 
      sock = urllib2.urlopen(host) 
      data = sock.read() 

      self.queue.task_done() 

hosts = ['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com', 'http://stackoverflow.com'] 
start = time.time() 

def main(): 
    queue = Queue.Queue() 

    for i in range(len(hosts)): 
     t = ThreadURL(queue) 
     t.start() 

    for host in hosts: 
     queue.put(host) 

    queue.join() 

if __name__ == '__main__': 
    main() 
    print 'Elapsed time: {0}'.format(time.time() - start) 

मैं कैसे थ्रेडिंग प्रदर्शन करने के लिए चारों ओर मेरे सिर प्राप्त करने की कोशिश कर रहा है और कुछ ट्यूटोरियल के बाद, मैं ऊपर ले कर आए हैं के साथ कुछ सहायता की आवश्यकता है।अजगर सूत्रण/कतार

क्या यह करना चाहिए था है:

  1. कतार Initialiase
  2. मेरी थ्रेड पूल बनाएं और फिर मेजबान
  3. मेरे ThreadURL वर्ग फिर काम शुरू करना चाहिए की सूची क़तार एक बार एक मेजबान में है कतार और पढ़ने वेबसाइट डेटा
  4. कार्यक्रम

खत्म करना चाहिए क्या मैं पहली बार बंद पता करने के लिए है, एक चाहते मैं यह सही ढंग से कर रहा हूँ? क्या यह धागे को संभालने का सबसे अच्छा तरीका है?

दूसरा, मेरा प्रोग्राम बाहर निकलने में विफल रहता है। यह Elapsed time लाइन प्रिंट करता है और फिर वहां लटकता है। मुझे जाने के लिए मुझे अपने टर्मिनल को मारना है। मुझे लगता है कि यह queue.join() के गलत उपयोग के कारण है?

उत्तर

6

आपका कोड ठीक दिखता है और काफी साफ है।

आपका एप्लिकेशन अभी भी "लटकता" है क्योंकि कार्यकर्ता धागे अभी भी चल रहे हैं, मुख्य अनुप्रयोग के लिए कतार में कुछ डालने का इंतजार है, भले ही आपका मुख्य धागा समाप्त हो गया हो।

इसे ठीक करने का सबसे आसान तरीका है कि आप कॉल शुरू करने से पहले t.daemon = True कर थैम्स को डेमॉन के रूप में चिह्नित करें। इस तरह, धागे प्रोग्राम रोकना बंद नहीं करेंगे।

2

ठीक दिखता है। यान डेमन सुझाव के बारे में सही है। यह आपके लटका को ठीक करेगा। मेरा एकमात्र सवाल यह है कि कतार का उपयोग क्यों करें? आप कोई क्रॉस थ्रेड संचार नहीं कर रहे हैं, इसलिए ऐसा लगता है कि आप मेजबान जानकारी को ThreadURL init() में एक तर्क के रूप में भेज सकते हैं और कतार छोड़ सकते हैं।

इसके साथ कुछ भी गलत नहीं, बस सोच रहा है।

+0

मैंने कतार का उपयोग किया क्योंकि यही वह उदाहरण है जो मैंने पढ़ा है उदाहरण/ट्यूटोरियल का उपयोग कर रहे थे। धागे के बीच डेटा भेजते समय कतार केवल उपयोगी क्यों होती है? थ्रेडिंग/क्यूइंग पर मुझे मिली एकमात्र जानकारी ट्यूटोरियल्स थी (जो कोड दिखाती थी और बहुत सारी जानकारी नहीं थी) और ऑफिकल डॉक्स जो मुझे बहुत जटिल थे, समझने के लिए एक धागा शुरुआती। – dave

+1

यदि आप प्रति होस्ट एक थ्रेड लॉन्च कर रहे हैं, तो कतारों से आगे बढ़ना ठीक है और एक होस्ट को __init __() में पास करना ठीक है। लेकिन उस मामले पर विचार करें जहां आपके पास मेजबानों की एक बड़ी सूची है जो आप सीमित संख्या में धागे को खिलाना चाहते हैं। आप काम वितरित करने के लिए एक कतार का उपयोग करेंगे। –

1

थ्रेड रन फ़ंक्शन में एक चीज, जबकि ट्रू लूप, अगर कुछ अपवाद हुआ, तो task_done() को कॉल नहीं किया जा सकता है हालांकि get() को पहले ही कॉल किया जा चुका है। इस प्रकार queue.join() कभी खत्म नहीं हो सकता है।