选择要在启动线程前执行的方法

2024-03-28 20:23:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个小烧瓶应用程序,从页面下载图像和文本,这可能需要很长时间,所以 我想在parell中执行我的请求。我创建线程任务。我希望这个任务能够从网站下载文本或图像。我将我的任务保存在一个工人列表中。 不过,我想选择一个线程将执行的方法,然后启动整个线程。 如何将方法传递给线程运行方法()?这是一个子守护进程线程吗

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)


Tags: 方法textfromselftaskgetsavedef
1条回答
网友
1楼 · 发布于 2024-03-28 20:23:52
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()

相关问题 更多 >