web-dev-qa-db-fra.com

Exécuter des méthodes de classe dans les threads (python)

J'apprends actuellement Python et Classes et j'ai une question de base, mais je n'ai trouvé aucune réponse. Disons que j'ai cette classe factice

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

Je souhaite exécuter simultanément.

EDIT: Je sais que je devrais utiliser des threads, peut-être quelque chose comme ça

r = DomainOperations('google.com')

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

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

Mais dois-je les utiliser en dehors de la classe? Dois-je écrire une autre classe pour gérer les threads?

Quelle est la bonne façon pour faire cela?

43
nacholibre

Si vous les appelez depuis la classe, c'est aussi simple que:

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 __== '__main__':
    d = DomainOperations()
    d.run()
75
A. Rodas

Vous pouvez hériter de la classe Thread dans DomainOperation, de cette façon, le code serait plus propre et facilement compréhensible. vous devez remplacer une méthode run ().

from threading import threading.Thread

class DomainOperations(Thread):
    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):
       #domain will be resolved on first thread
       self.resolve_domain()
       #thumbnail will be resolved on second OR newly created below thread
       thread2 = Thread(target=self.generate_website_thumbnail)
       thread.start()
       # thread1 will wait for thread2
       self.join()
       # thread2 will wait for thread1, if it's late.
       thread2.join()
       # here it will print ip and thumbnail before exiting first thread
       print(self.domain_ip, self.website_thumbnail)

Et vous commencerez vos discussions de cette façon.

if __== '__main__':
   thread1 = DomainOperations()
   thread1.start()
2
Hafiz Hashim