2015-02-05 6 views
9

को डिमननाइज़ नहीं करता है मैं मुख्य रूप से कुछ और (यहां, time.sleep(100)) करते समय एक अलग थ्रेड में SimpleHTTPServer लॉन्च करना चाहता हूं।SimpleHTTPServer धागे के रूप में लॉन्च किया गया:

from SimpleHTTPServer import SimpleHTTPRequestHandler 
from BaseHTTPServer import HTTPServer 

server = HTTPServer(('', 8080), SimpleHTTPRequestHandler) 
print 'OK UNTIL NOW' 
thread = threading.Thread(target = server.serve_forever()) 
print 'STUCK HERE' 
thread.setdaemon = True 
try: 
    thread.start() 
except KeyboardInterrupt: 
    server.shutdown() 
    sys.exit(0) 

print 'OK' 

time.sleep(120) 

हालांकि, धागा रहता है "अवरुद्ध", यानी एक डेमॉन के रूप में शुरू नहीं कर रहा है और दुभाषिया print 'OK' तक नहीं पहुंचता है: यहाँ मेरी कोड का एक सरलीकृत नमूना है। यह न तो STUCK HERE तक पहुंचता है।

मुझे लगता है कि धागा केवल threading.Thread(...) पर कॉल करते समय प्रारंभ किया जाएगा और यह तब भी मुख्य धागा तब तक आगे बढ़ेगा जब तक इसे thread.start लॉन्च करने के लिए निर्देश नहीं मिला।

क्या इस कार्य को पूरा करने का कोई बेहतर तरीका है?

+1

:

thread.setdaemon = True 

इस होना करने के लिए थ्रेड = थ्रेडिंग। थ्रेड (target = server.serve_forever) – vijay

उत्तर

9

बदलें इस:

thread = threading.Thread(target = server.serve_forever()) 

इस होने के लिए:

thread = threading.Thread(target = server.serve_forever) 

और बदलने के इस:

thread.daemon = True 
3

thread = threading.Thread(target = server.serve_forever), यानी कॉल के बिना प्रयास करें।

आपके संस्करण के साथ समस्या यह है कि serv_forever() को उस रेखा को पार्स करने पर कहा जाता है जहां थ्रेड बनाया जाता है। इस प्रकार, आप अगली पंक्ति में कभी नहीं पहुंचते हैं।

तर्क प्रकार कॉल करने योग्य होना चाहिए, जिसे थ्रेड स्टार्ट पर कॉल किया जाएगा, इसलिए आपको इस फ़ंक्शन को निष्पादित करने के परिणाम को पारित करने के बजाय नाम, server.serve_forever पास करने की आवश्यकता है।

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