【问题标题】:Select method to execute inside thread before starting thread在启动线程之前选择要在线程内执行的方法
【发布时间】:2019-12-15 14:05:35
【问题描述】:

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

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)

【问题讨论】:

    标签: python multithreading flask


    【解决方案1】:
    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()
    

    【讨论】:

    • 是的,这很有帮助,你能告诉我,为什么我会在工作完成后停止守护进程?我从来没有指定像 d = threading.Thread(name='daemon', target=d) d.setDaemon(True) 这样的指令我得到的是:[]
    • 是的。这意味着工作已经完成。
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多