线程
一、线程模块
二、Thread(类)
三、join & setDaemon
join
setDaemon
四、创建线程
方法1:实例Thread类
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:DM time:2019/8/2 20:49
from threading import Thread
import time
def f1(people):
print("hello,{}".format(people))
time.sleep(3)
print("bye")
def f2():
print("hi")
time.sleep(3)
print("goodbye")
if __name__ == '__main__':
# 1.正常调用,是有先后顺序,主线程
f1()
f2()
# 2.线程操作
f1_thread = Thread(target=f1, args=("胡歌",), name='hello') # 创建了一个线程实例
f2_thread = Thread(target=f2, name='hi') # 实例对象时,函数并未执行
# 设置线程名称
f1_thread.setName("dai")
f1_thread.setName("hu")
print("f1 name:", f1_thread.getName())
print("f2 name:", f2_thread.getName())
# 守护线程
# f1_thread.setDaemon(True) # 在主线程执行完毕后,强行结束子线程,程序结束
# f2_thread.setDaemon(True)
# 运行线程
f1_thread.start() # 调用start方法才开始执行
f2_thread.start()
# 阻塞调用
f1_thread.join() # 阻塞调用,主线程进行等待
f2_thread.join()
# 若不调用阻塞,在主线程执行完毕后并不会立即结束程序,而是等子程序执行完毕后,才结束程序
print("主线程执行完毕")
"""
主线程执行完毕了,但是子线程依然没有关闭(或陷入死循环),程序则一直无法关闭,于是出现了守护线程
守护线程:主线程执行完毕后,程序就关闭
"""
方法2:继承并重写Thread类
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:DM time:2019/8/2 21:15
from threading import Thread
import time
# 1.方式一(不太适用,因为不能接收参数)
class MyThread(Thread):
def run(self):
print('hello')
time.sleep(3)
print('bye')
my_thread = MyThread() # 创建一个线程实例
my_thread.start()
# 重写了类中run方法,通过start方法自动去调用类中的run方法
# 2.方式二
class MyThread(Thread):
def __init__(self, people, *args, **kwargs):
super().__init__(*args, **kwargs) # 继承父类构造方法
self.people = people
# 为了展示效果而重写的run方法(可忽略)
def run(self):
print('hello,{}'.format(self.people))
time.sleep(3)
print('bye')
my_thread = MyThread("齐时久", name="hello") # 创建一个线程实例
print(my_thread.getName())
my_thread.start()