Python的一个重要的优势在于多线程的任务处理,我们平常使用Python编写简单的脚本是不用多线程的,但涉及到多任务调度时,就需要多线程进行处理了。
首先科普一下什么是“多线程”,具体对多线程的可续定义请移步百度自行查找学习,这里我谈一下自己的看法。
假设一个人周末在家处理家务,他需要烧水,等待水开的时间是10分钟;他需要洗衣服,整理脏衣服放进洗衣机后,需要等待的时间是40分钟;在外面订购了午饭用的菜品,选择并下订单需要5分钟,等待菜品到达需要1个小时...
这是最常见的场景了,也是我们自己的生活写照,那么你是怎么处理这些“任务”的。如果处理器和我们一起处理完一个任务再耐心等待,那就不需要处理器了,我们自己就可以完成。我们追求的是高效、快捷、迅速,结合自己的思维就可以认识到,很多等待时间我们可以去取完成其他的任务,这样的处理方式就会高效许多。
这就是“多线程”的模型,同时启动多个任务(非严格意义的同时),利用一个任务的空闲时间去处理另外的任务,根据任务的重要紧急情况(优先级的概念)可以在处理一个任务时进行中断去处理另外一个任务,每个任务其实就是一个“线程”,多任务处理自然就是“多线程”。在操作系统中,这些任务的调度和切换是非常快的,常是毫秒级别的切换频率,所以从人的认知角度来看,这些任务就像在同时进行一样,这也就使得我们在写文章时还能听着歌了。
这里面还有另外一个概念,即是“多进程”,进程是可以同时进行处理任务的,和“多线程”不一样,这是比较严格的“同时”,这依赖于多个处理器,相当于多个人在同时完成不同任务。这篇文章重点讨论如何使用Python进行多线程处理。
Python处理多线程任务方法有很多种,这篇文章重点演示使用Thread类创建多线程。
这种方法是直接使用Thread类创建线程,验证思路是创建两个线程并同时启动,一个线程用来打印当地时间,另外一个线程用来打印“ * ”号。
演示代码如下:(可以复制粘贴,小心缩进不要搞错)
————————————————————————————————
import threading # 导入threading相关类
import time # 导入time相关类
def GetTime(): # 定义一个获取本地时间函数
while True: # 创建函数死循环,即一直循环运行
print('\n',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 打印本地时间
time.sleep(5) # 休眠5秒
def PrintFlag(): # 定义一个参照函数,打印【*】美妙打印一个【*】
while True: # 创建函数死循环
print('*',end="") # 打印一个*
time.sleep(1) # 休眠1秒
t1 = threading.Thread(target=GetTime) # 创建线程1
t2 = threading.Thread(target=PrintFlag) # 创建线程2
t1.start() # 启动线程1
t2.start() # 启动线程2
————————————————————————————————
代码的排版缩进如下图所示,新手一定要注意,Python是根据代码缩进来进行包含处理的,每个缩进是一个【Tab】符,即四个空格,如果缩进错误,会导致代码逻辑混乱,甚至导致不容易排查的错误,所以一定要养成好习惯,不要在这里出错。
运行代码,执行结果如下图所示。
从执行结果可以看出,代码的运行结果完全符合预期。
*****************************END LINE******************************