QThread、Thread、ThreadPoolExecutor的线程启动

7 线程的问题
现在工程中使用的线程工具有三种,Thread 、QThread、ThreadPoolExecutor。
7.1 QThread 的线程启动

from PyQt5.QtCore import QThread


class TaskTest(QThread):

    def __init__(self):
        super(TaskTest, self).__init__()
        self.data = None

    def qthread_start(self):
        while True:
            print("qthread test!")
            time.sleep(1)

    def run(self):
        self.qthread_start()


if __name__ == "__main__":
    task_test = TaskTest()
    try:
        task_test.start()
    except Exception as e:
        print(e)
    time.sleep(3)

当主线程结束后,QThread启动的线程会直接结束,不会在继续运行。注意如果时间过短,子线程会打印不了东西直接结束。
7.2 Thread的线程启动

from threading import Thread
class TaskTest(Thread):

    def __init__(self):
        super(TaskTest, self).__init__()
        self.data = None

    def qthread_start(self):
        while True:
            print("qthread test!")
            time.sleep(1)

    def run(self):
        self.qthread_start()


if __name__ == "__main__":
    task_test = TaskTest()
    try:
        task_test.start()
    except Exception as e:
        print(e)
    time.sleep(3)

Thread启动的线程在主线程结束后依然不会结束,而是会继续运行。直到收到退出指令或代码执行结束。

7.3 ThreadPoolExecutor 线程启动

from concurrent.futures import ThreadPoolExecutor


class TaskTest(Thread):

    def __init__(self):
        super(TaskTest, self).__init__()
        self.data = None

    def qthread_start(self):
        i = 1
        while True:
            print("qthread test!")
            time.sleep(1)
            i+=1
            if i == 10:
                break

    def run(self):
        task_thread = ThreadPoolExecutor(max_workers=1)
        task_thread.submit(self.qthread_start)
        # self.qthread_start()


if __name__ == "__main__":
    task_test = TaskTest()
    try:
        task_test.run()
    except Exception as e:
        print(e)
    time.sleep(3)

ThreadPoolExecutor的线程启动不会在主线程结束后结束,同样是收到结束命令或者执行结束后退出。

7.4 主线程结束后,子线程中建立新的线程问题,
QThread 继承类处理

import time
from concurrent.futures import ThreadPoolExecutor
from threading import Thread
from PyQt5.QtCore import QThread


class TaskTest(QThread):

    def __init__(self):
        super(TaskTest, self).__init__()
        self.data = None

    def task_while_2(self):
        while True:
            print("子线程——2", Thread.getName(self))
            print("Task _ 2!")
            time.sleep(1)

    def task_while(self):
        i = 1
        while True:
            try:
                print("子线程——1", Thread.getName(self))
                print("Task _ 1!")
                time.sleep(1)
                i += 1
                if i == 10:
                    task_thread = ThreadPoolExecutor(max_workers=1)
                    task_thread.submit(self.task_while_2)
            except Exception as e:
                print(e)

    def run(self):
        # task_thread = ThreadPoolExecutor(max_workers=1)
        # task_thread.submit(self.qthread_start)
        self.task_while()
        # self.qthread_start()





if __name__ == "__main__":
    task_test = TaskTest()
    try:
        task_test.start()
    except Exception as e:
        print(e)
    print("主线程", Thread.getName(task_test))
    # time.sleep(9)
    print("继续运行")

1.当只有QThread的线程运行时,主线程停止后,Qthread线程会直接退出,
2.当QThread中的线程中有ThreadPoolExecutor的线程存在时,Qthread程序会继续运行,直到ThreadPoolExecutor的线程结束

Thread继承类

class TaskTest(Thread):

    def __init__(self):
        super(TaskTest, self).__init__()
        self.data = None

    def task_while_2(self):
        while True:
            # print("子线程——2", Thread.getName(self))
            print("Task _ 2!")
            time.sleep(1)
            # break

    def task_while(self):
        i = 1
        while True:
            try:
                # print("子线程——1", Thread.getName(self))
                print("Task _ 1!")
                time.sleep(1)
                i += 1
                if i == 3:
                    task_thread = ThreadPoolExecutor(max_workers=1)
                    task_thread.submit(self.task_while_2)
            except Exception as e:
                print(e)

    def run(self):
        # task_thread = ThreadPoolExecutor(max_workers=1)
        # task_thread.submit(self.qthread_start)
        self.task_while()
        # self.qthread_start()


if __name__ == "__main__":
    task_test = TaskTest()
    try:
        task_test.start()
    except Exception as e:
        print(e)
    # print("主线程", Thread.getName(task_test))
    # time.sleep(4)
    print("继续运行")

Thread的继承类,在主线程结束后,子线程可以正常运行,且可以生成新的子线程。

你可能感兴趣的:(线程,qt,python,开发语言)