一个进程中必定有一个主线程,线程自己不拥有系统资源。没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
1、多线程的作用,就是让工作同时进行——join()阻塞
import threading
import time
def work1(a):
print('任务1开始了:',time.ctime())
print('我是',a)
time.sleep(4)
print('任务1结束了:',time.ctime())
def work2(b):
print('任务2开始了:',time.ctime())
print('我喜欢',b)
time.sleep(2)
print('任务2结束了:',time.ctime())
print('开始主线程执行.....',time.ctime())
t1=threading.Thread(target=work1,args=('大帅哥',))
t2=threading.Thread(target=work2,args=('大美女',))
t1.start()
t2.start()
# t1.join()
# t2.join() 阻塞
time.sleep(2)
print('结束主线程执行.....',time.ctime())
说明:
1)此脚本,是非保护线程,即当主线程2秒结束后,子线程t1还在休眠,所以会继续执行,总用时间是t1的时间4秒
2)而加上.join(),代表主程序等待子线程执行完毕再退出,只有一个参数,如.join(2),即等待子线程t1 2秒,如果没结束,就强制结束。.join()的作用就是阻塞~!等待t1执行完,主线程等待2秒结束,一共用时6秒,性能不高。
2、返回线程thread对象列表
def worker():
print('test')
time.sleep(2)
threads=[]
for i in range(5):
t=threading.Thread(target=worker)
threads.append(t)
t.start()
for item in threading.enumerate():
print(item)
for item in threads:
print(item)
3、守护主线程:即当主线程结束时,子线程没结束的,不予处理 setDaemon(True)
import threading
import time
def work1(a):
print('任务1开始了:',time.ctime())
print('我是',a)
time.sleep(4)
print('任务1结束了:',time.ctime())
def work2(b):
print('任务2开始了:',time.ctime())
print('我喜欢',b)
time.sleep(2)
print('任务2结束了:',time.ctime())
print('开始主线程执行.....',time.ctime())
t1=threading.Thread(target=work1,args=('大帅哥',))
t2=threading.Thread(target=work2,args=('大美女',))
t1.setDaemon(True) #setDaemon一定要写在start前,否则报错
t2.setDaemon(True)
t1.start()
t2.start()
time.sleep(3)
print('结束主线程执行.....',time.ctime())
4、Timer:定时执行
import threading
import time
from threading import Timer
def work1(a):
print('任务1开始了:',time.ctime())
print('我是',a)
time.sleep(4)
print('任务1结束了:',time.ctime())
def work2(b):
print('任务2开始了:',time.ctime())
print('我喜欢',b)
time.sleep(2)
print('任务2结束了:',time.ctime())
t1=threading.Thread(target=work1,args=('大帅哥',))
# t2=threading.Thread(target=work2,args=('大美女',))
t1.start()
t=Timer(5,work2,args=['大美女'])
t.start()
任务1开始了: Thu Jul 25 14:36:17 2019
我是 大帅哥
任务1结束了: Thu Jul 25 14:36:21 2019
任务2开始了: Thu Jul 25 14:36:22 2019
我喜欢 大美女
任务2结束了: Thu Jul 25 14:36:24 2019
说明:以上结果可以看出,t1在4s时结束,t2设置的是5s后再开始执行
※再来看一条例子:
import threading
import datetime
interval_time=3
def test(ms):
now=datetime.datetime.now()
now_new=now.strftime('%Y-%m-%d %H:%M:%S')
print(f'{now_new}:I love you python')
#ms:指定的时间 ;test:要执行的方法;[ms,]:方法的参数
threading.Timer(ms,test,[ms,]).start()
if __name__ == '__main__':
print('任务开始:',datetime.datetime.now())
test(interval_time)
执行结果:
任务开始: 2019-12-12 08:57:23.551809
2019-12-12 08:57:23:I love you python
2019-12-12 08:57:26:I love you python
2019-12-12 08:57:29:I love you python