打个比方:
注意:
- (1)一个cpu同一时间只能处理一件事,如果同时有多个任务,那么就轮换着执行,但是每个任务执行的时间非常短暂,无法感受到。
- (2)使用线程的时候,不管它的顺序,因为cpu是随机调度的。
- (3)一个程序的执行,就会有一个主线程
常用参数说明:
常用实例方法:
Thread.run(self)
线程启动时运行的方法,由该方法调用target参数所指定的函数。
Thread.start(self)
启动线程,start方法就是去帮你调用run方法。
Thread.terminate(self)
强制终止线程。
Thread.join(self, timeout=None)
阻塞调用,主线程进行等待。
Thread.setDaemon(self, daemonic)
将子线程设置为守护线程。
Thread.getName(self, name)
获取线程名称。
Thread.setName(self, name)
设置线程名称:
但是刚刚也讲了实际使用中我们都是使用的threading模块,所以此处只是简单介绍一下Thread类,下面讲解都是使用的threading模块!
在python中创建线程有两种方式:
(需要注意的是:下面在主线程里添加了t1,t2两个子线程,①如果没有设置setDaemon守护线程,那么整个文件顺序执行完[即主线程]之后,对应的两个子线程并行执行;②如果设置了守护线程,那么对应的设置了守护线程的子线程在主线程执行完之后立马被杀死!)
# -*- coding: utf-8 -*- import threading import time # 定义线程要运行的函数 def sing(): # 为了便于观察,sleep1秒 for i in range(5): print("正在唱歌......") time.sleep(1) def dance(): # 为了便于观察,sleep1秒 for i in range(5): print("正在跳舞......") time.sleep(1) if __name__ == '__main__': # 创建两个线程实例 t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) # 设置守护线程 t1.setDaemon(True) # 守护线程:把子线程作为主线程的守护线程 t2.setDaemon(True) # 启动线程 t1.start() t2.start() print('主线程结束')
未设置t1,t2为守护线程时的输出:
设置t1,t2为守护线程时的输出:
# -*- coding: utf-8 -*- import threading import time # 继承threading中的Thread类 class MyThread(threading.Thread): # 线程中所需要的参数 def __init__(self, name): super().__init__() self.name = name # 重构run方法,注意这个是表示线程活动的方法,必须有! def run(self): print('I am %s' % self.name) time.sleep(2) # 创建线程实例 t1 = MyThread('guhanzhe') t2 = MyThread('coolboy') # 启动线程 t1.start() t2.start() # 打印线程名 print(t1.getName()) print(t2.getName())
在说这两个方法之前 , 需要知道主线程与子线程的概念:
主线程的重要性体现在两方面 :
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子线程结束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) t1.start() # 阻塞主线程,等待子线程运行结束 t1.join() print('主线程结束......')
大家可以尝试不加join()的话输出是什么样的哦~
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子线程结束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) # 设置守护线程 t1.setDaemon(True) t1.start() print('主线程结束......')