現在、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()
しかし、クラス外で使用する必要がありますか?スレッドを処理する別のクラスを作成する必要がありますか?
正しい方法とは何ですか?
クラスから呼び出す場合、次のように簡単です。
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()
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()