nac*_*bre 44 python methods multithreading class
我目前正在学习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
Run Code Online (Sandbox Code Playgroud)
我想同时运行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()
Run Code Online (Sandbox Code Playgroud)
但是我应该在课外使用它们吗?我应该写另一个类来处理线程吗?
这样做的正确方法是什么?
A. *_*das 75
如果你从课堂上打电话给他们,就像这样简单:
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()
Run Code Online (Sandbox Code Playgroud)
小智 8
您可以在DomainOperation中继承Thread类,这样代码会更加干净且易于理解。你必须重写run()方法。
from threading import Thread
class DomainOperations(Thread):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
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)
Run Code Online (Sandbox Code Playgroud)
您将以这种方式启动您的线程。
if __name__ == '__main__':
thread1 = DomainOperations()
thread1.start()
Run Code Online (Sandbox Code Playgroud)