2013-01-24 13 views
7

Czy ktoś wie, w jaki sposób można wysłać zmienną (lub uzyskać zmienną) z threadOne do threadTwo w tym kodzie bez użycia zmiennej globalnej? Jeśli nie, w jaki sposób będę obsługiwał zmienną globalną? Po prostu zdefiniuj go przed obiema klasami i użyj globalnej definicji w funkcji run?Wysyłanie wiadomości między wątkami klas 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() 

Dzięki

Odpowiedz

14

Można użyć queues do wysyłania wiadomości pomiędzy wątkami w sposób bezpieczny wątku.

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

Czy definiuję je poza klasą? –

+0

Powinieneś utworzyć kolejkę przed rozpoczęciem korzystania z nich, więc tak, na zewnątrz/przed klasami wątków. –

4

Proszę bardzo, korzystając z 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() 

Używanie zmiennej globalnej data.

Pierwszy wątek nabywa blokadę i zapisuje do zmiennej.

Drugi wątek czeka na dane i drukuje je.

Aktualizacja

Jeśli masz więcej niż dwa wątki, które muszą być przekazywane do wiadomości dookoła, to lepiej jest użyć threading.Condition.

+1

To prawie zawsze lepiej używać kolejki niż zmiennej globalnej z blokadą do wysyłania danych z jednego wątku do drugiego. Powinieneś zacząć od kolejki, chyba że istnieje dobry powód * nie * do jej użycia. Zobacz odpowiedź poniżej od Geralda Kaszuby –

+0

@MarkLakata Czy możesz wyjaśnić, dlaczego? – ATOzTOA

+0

@MarkLakata Chciałbym również wiedzieć, dlaczego. –

Powiązane problemy