web-dev-qa-db-ja.com

スレッドでクラスメソッドを実行する(Python)

現在、PythonとClassesを学んでいます。基本的な質問がありますが、答えは見つかりませんでした。このダミークラスがあるとします。

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

Resolve_domainとgenerate_website_thumbnailを同時に実行し、スレッドが終了したら、IPとサムネイルを印刷します。

編集:私はスレッドを使用する必要があることを知っています。

r = DomainOperations('google.com')

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

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

しかし、クラス外で使用する必要がありますか?スレッドを処理する別のクラスを作成する必要がありますか?

正しい方法とは何ですか?

43
nacholibre

クラスから呼び出す場合、次のように簡単です。

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

DomainOperationでThreadクラスを継承できます。これにより、コードがよりクリーンでわかりやすくなります。 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)

そして、この方法でスレッドを開始します。

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