2013-03-12 6 views
31

Attualmente sto imparando Python e Classes e ho una domanda di base, ma non ho trovato alcuna risposta. Diciamo che ho questa classe fittiziaEsegui i metodi Class nei thread (python)

class DomainOperations: 
    def __init__(self, domain): 
     self.domain = domain 
     self.domain_ip = '' 
     self.website_thumbnail = '' 

    def resolve_domain(self): 
     #resolve domain to ipv4 and save to self.domain_ip 

    def generate_website_thumbnail(self): 
     #generate website thumbnail and save the url to self.website_thumbnail 

Voglio correre contemporaneamente resolve_domain e generate_website_thumbnail e quando i fili sono finiti voglio stampare l'IP e la miniatura.

EDIT: So che dovrei usare le discussioni, forse qualcosa di simile

r = DomainOperations('google.com') 

t1 = threading.Thread(target=r.resolve_domain) 
t1.start() 

t2 = threading.Thread(target=r.generate_website_thumbnail) 
t2.start() 

Ma non li ho utilizzare al di fuori della classe? Devo scrivere un'altra classe per gestire i thread?

Che cos'è il modo per farlo?

risposta

52

Se li chiami dalla classe, è il più semplice:

import threading 

class DomainOperations: 

    def __init__(self): 
     self.domain_ip = '' 
     self.website_thumbnail = '' 

    def resolve_domain(self): 
     self.domain_ip = 'foo' 

    def generate_website_thumbnail(self): 
     self.website_thumbnail= 'bar' 

    def run(self): 
     t1 = threading.Thread(target=self.resolve_domain) 
     t2 = threading.Thread(target=self.generate_website_thumbnail) 
     t1.start() 
     t2.start() 
     t1.join() 
     t2.join() 
     print(self.domain_ip, self.website_thumbnail) 

if __name__ == '__main__': 
    d = DomainOperations() 
    d.run() 
+5

-1: è possibile eseguire un thread all'interno di una classe, ma ha detto thread non erediterà lo spazio dei nomi 'sé'. Quindi in pratica no non puoi. Kinda informazioni importanti –

+0

@jasondancks Mi dispiace, ma ti sbagli. Guarda il seguente esempio: http://pastebin.com/8JWzReCW. 'self.resolve_domain' e' self.generate_website_thumbnail' useranno gli attributi dell'oggetto poiché 'self' è il primo argomento di entrambe le chiamate. –

+1

eh. Oggi non ho potuto farlo funzionare nel mio codice, quindi ho dovuto prendere il mio metodo fuori dalla classe e passare l'oggetto come parametro. Chiedo scusa. –