多线程初步了解
#创建一个简单的线程
t = threading.Timer(3,demo,args=(1,))
t2 = threading.Timer(4,demo,args=(2,))
#启动线程,3秒之后调用函数
t.start()
t2.start()
time.sleep(7) #如果没有该指令,则不会打印,因为时间超过3秒,线程会被取消
print(t.name) #线程的名称
print(t.ident) #线程的标识符
t.cancel()
线程的join方法
from threading import Thread
import time
import datetime
'''
线程的join方法用来等待被调用线程结束或者超时后继续执行当前线程的后续代码
'''
def func1(x,y):
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
for i in range(x,y):
print(i,end=' ')
print()
time.sleep(10)
t1 = Thread(target=func1,args=(5,10))
t1.start()
t1.join(5) #等待t1运行结束或者等待5s,与time.sleep(5)效果相似
# time.sleep(5)
t2 = Thread(target=func1,args=(1,5))
t2.start()
2020-07-26 22:07:24
5 6 7 8 9
2020-07-26 22:07:29
1 2 3 4
线程的状态检测
import time
from threading import Thread
def func():
print('AAA...')
time.sleep(10)
# t1 = Thread(target=func())
t1 = Thread(target=func) #创建线程
print('t1:',t1.is_alive()) #线程还未开启,返回False
t1.start()
print('t1:',t1.is_alive()) #线程开启 返回 True
t1.join(5) #join方法应超时而结束,即已经超过5s,不等待线程运行结束 直接运行后面的代码,此时线程还在运行
print('t1:',t1.is_alive()) #线程还在运行,返回True
t1.join() #等待线程结束
print('t1:',t1.is_alive()) #线程结束 返回False
t1: False
AAA...
t1: True
t1: True
t1: False
线程的daemon属性
若在主线程中创建子线程,当主线程结束时会根据子线程的daemon属性来决定是否结束子线程,False会等待子线程结束之后在结束
class mythread(threading.Thread):
def __init__(self,num,name):
threading.Thread.__init__(self,name=name)
self.num=num
#重写run方法
def run(self):
time.sleep(self.num)
print(self.num)
t1 = mythread(1,'t1')
t2 = mythread(5,'t2')
t2.daemon = True
print(t1.daemon)
print(t2.daemon)
t1.start()
t2.start()
False
True
1
可以看到,实际打印并没有打印5,因为修改了t2的daemon属性为True,导致在t1结束之后主线程就结束了