2013-01-24 42 views
7

क्या कोई जानता है कि मैं थ्रेड से एक चर (या एक चर प्राप्त) कैसे भेज सकता हूं, इस कोड में वैश्विक चर का उपयोग किए बिना? यदि नहीं, तो मैं वैश्विक चर कैसे संचालित करूं? बस दोनों कक्षाओं से पहले इसे परिभाषित करें और रन फ़ंक्शन में वैश्विक परिभाषा का उपयोग करें?कक्षा धागे के बीच संदेश भेजना Python

import threading 

print "Press Escape to Quit" 

class threadOne(threading.Thread): #I don't understand this or the next line 
    def run(self): 
     setup() 

    def setup(): 
     print 'hello world - this is threadOne' 


class threadTwo(threading.Thread): 
    def run(self): 
     print 'ran' 

threadOne().start() 
threadTwo().start() 

धन्यवाद

उत्तर

14

आप एक धागा सुरक्षित तरीका में धागे के बीच संदेश भेजने के लिए queues उपयोग कर सकते हैं।

def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

q = Queue() 
for i in range(num_worker_threads): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 

for item in source(): 
    q.put(item) 

q.join()  # block until all tasks are done 
+0

क्या मैं कक्षा के बाहर इन्हें परिभाषित करता हूं? –

+0

आपको उनका उपयोग शुरू करने से पहले कतार बनाना चाहिए, इसलिए हां, थ्रेड क्लासेस के बाहर/पहले। –

4

यहां आप Lock का उपयोग करके जाते हैं।

import threading 

print "Press Escape to Quit" 

# Global variable 
data = None 

class threadOne(threading.Thread): #I don't understand this or the next line 
    def run(self): 
     self.setup() 

    def setup(self): 
     global data 
     print 'hello world - this is threadOne' 

     with lock: 
      print "Thread one has lock" 
      data = "Some value" 


class threadTwo(threading.Thread): 
    def run(self): 
     global data 
     print 'ran' 
     print "Waiting" 

     with lock: 
      print "Thread two has lock" 
      print data 

lock = threading.Lock() 

threadOne().start() 
threadTwo().start() 

वैश्विक चर data का उपयोग कर।

पहला धागा लॉक प्राप्त करता है और चर को लिखता है।

दूसरा धागा डेटा के लिए इंतजार करता है और प्रिंट करता है।

अद्यतन

आप एक से अधिक दो धागे जो संदेशों की जरूरत है चारों ओर पारित होने के लिए है, तो यह threading.Condition उपयोग करने के लिए बेहतर है।

+1

एक थ्रेड से डेटा को एक थ्रेड से दूसरे में भेजने के लिए लॉक के साथ वैश्विक चर के बजाए कतार का उपयोग करना लगभग हमेशा बेहतर होता है। आपको एक कतार के साथ शुरू करना चाहिए, जब तक कि इसका उपयोग करने के लिए कोई अच्छा कारण नहीं है * नहीं। गेराल्ड Kaszuba –

+0

@MarkLakata से नीचे का जवाब देखें क्या आप कृपया बता सकते हैं क्यों? – ATOzTOA

+0

@ मार्ककाकाटा मुझे यह जानने में दिलचस्पी होगी कि क्यों भी। –