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的继承类,在主线程结束后,子线程可以正常运行,且可以生成新的子线程。