python高级之多任务编程
1、多任务编程–线程
1) 多任务的介绍
<1> 多任务概念:在同一时间内执行多个任务,每个任务可以理解成现实生活中干的活
<2> 并发:指的是任务多余的cpu核数,通过操作系统的各种调度算法,实现用多个任务一起执行
<3> 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
2)多任务的介绍
<1> 线程的概念:线程就是在程序运行过程中的一个分支,每次运行的程序至少都有一个线程
<2> 单线程执行
例:from time import sleep # 导入模块
# 唱歌
def sing():
for i in range(3):
print("正在唱歌...%d" % i)
sleep(1)
# 跳舞
def dance():
for i in range(3):
print("正在跳舞...%d" % i)
sleep(1)
if __name__ == '__main__':
sing() #唱歌
dance() #跳舞
运行结果如下:
正在唱歌...0
正在唱歌...1
正在唱歌...2
正在唱歌...0
正在唱歌...1
正在唱歌...2
<3> 多线程执行
#导入线程模块
import threading
<4> 线程类Thread参数说明
Thread([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前只能使用None
target: 执行的目标任务名
args: 以元组的方式给执行任务传参
kwargs: 以字典方式给执行任务传参
name: 线程名,一般不用设置
<5> 启动线程
使用start可以启动线程
<6> 使用多线程完成多任务的代码例题
import threading
import time
# 唱歌任务
def sing():
# 扩展: 获取当前线程
# print("sing当前执行的线程为:", threading.current_thread())
for i in range(3):
print("正在唱歌...%d" % i)
time.sleep(1)
# 跳舞任务
def dance():
# 扩展: 获取当前线程
# print("dance当前执行的线程为:", threading.current_thread())
for i in range(3):
print("正在跳舞...%d" % i)
time.sleep(1)
if __name__ == '__main__':
# 扩展: 获取当前线程
# print("当前执行的线程为:", threading.current_thread())
# 创建唱歌的线程
# target: 线程执行的函数名
sing_thread = threading.Thread(target=sing)
# 创建跳舞的线程
dance_thread = threading.Thread(target=dance)
# 开启线程
sing_thread.start()
dance_thread.start()
执行结果:
正在唱歌...0
正在跳舞...0
正在唱歌...1
正在跳舞...1
正在唱歌...2
正在跳舞...2
3) 线程的注意点
1、线程之间执行时无序的
例:
import threading
import time
def task():
time.sleep(1)
print("当前线程:", threading.current_thread().name)
if __name__ == '__main__':
for _ in range(5):
sub_thread = threading.Thread(target=task)
sub_thread.start()
执行结果:
当前线程: Thread-3
当前线程: Thread-2
当前线程: Thread-4
当前线程: Thread-1
当前线程: Thread-5
2、主线程等待所有的子程序解释后才结束
import threading
import time
# 测试主线程是否会等待子线程执行完成以后程序再退出
def show_info():
for i in range(5):
print("test:", i)
time.sleep(0.5)
if __name__ == '__main__':
sub_thread = threading.Thread(target=show_info)
sub_thread.start()
# 主线程延时1秒
time.sleep(1)
print("over")
3、守护程序
例:
import threading
import time
# 测试主线程是否会等待子线程执行完成以后程序再退出
def show_info():
for i in range(5):
print("test:", i)
time.sleep(0.5)
if __name__ == '__main__':
# 创建子线程守护主线程
# daemon=True 守护主线程
# 守护主线程方式1
sub_thread = threading.Thread(target=show_info, daemon=True)
# 设置成为守护主线程,主线程退出后子线程直接销毁不再执行子线程的代码
# 守护主线程方式2
# sub_thread.setDaemon(True)
sub_thread.start()
# 主线程延时1秒
time.sleep(1)
print("over")
4、总结
1)线程之间执行时是无序的
2)主线程会等待所有的子程序结束后才会结束,如果需要可以设置守护主线程