我创建了一个小烧瓶应用程序,用于从页面下载图像和文本,这可能需要很长时间,因此我想用Parell执行我的请求。我创建线程任务。我希望此任务能够从站点下载文本或图像。我将任务保存在工人清单中。但是我想选择一种方法,该方法将执行线程,然后启动整个线程。如何将我的方法传递给线程运行method()?这将是子守护程序线程吗?
import threading
import time
workers = []
class SavePage:
def get_text(self):
print("Getting text")
def get_images(self):
print("Getting images")
class Task(threading.Thread):
def __init__(self):
super().__init__()
self.save_page = SavePage()
def get_text_from_page(self):
self.save_page.get_text()
def get_images_from_page(self):
self.save_page.get_images()
if __name__ == '__main__':
task = Task()
task.get_images_from_page() # Why this executes, when I didn't put task.start() ?
# Moreover, is this really threaded? or just uses a method from class Task?
workers.append(task) # I want this list to be empty, after job is finished
print("".join(str(worker.is_alive()) for worker in workers)) #
print(workers)
task.get_images_from_page() # Why this executes, when I didn't put task.start() ? # Moreover, is this really threaded? or just uses a method from class Task?
没有线程。这只是主线程中的普通方法调用。
Thread.start
是将在另一个线程内启动Thread.run
功能的方法。
您可以在__init__
中设置一些状态来选择要执行的功能:
class Task(threading.Thread):
def __init__(self, action):
super().__init__()
self.save_page = SavePage()
self.action = action
def get_text_from_page(self):
self.save_page.get_text()
def get_images_from_page(self):
self.save_page.get_images()
def run(self):
if self.action == "text":
self.get_text_from_page()
elif self.action == "images":
self.get_images_from_page()
请记住,可以通过传递目标函数来以更简单的方式运行线程:
def target_func():
save_page = SavePage()
save_page.get_images()
t = threading.Thread(target=target_func)
t.start()
# or in this simple case:
save_page = SavePage()
t = threading.Thread(target=save_page.get_images)
t.start()