线程介绍
什么是线程
线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
为什么要使用多线程
线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。
因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性多个线程共享同一个进程的虚拟空间。线程共享的环境包括进程代码段、进程的公有数据等,利用这些共享的数据,线程之间很容易实现通信。
操作系统在创建进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能要高得多。
总结起来,使用多线程编程具有如下几个优点:
进程之间不能共享内存,但线程之间共享内存非常容易。
操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。
Python 语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了 Python 的多线程编程。
单线程
我想做菜,那么其中的洗菜,炒菜等动作是先后进行的。
from time importctime,sleepdefwash():for i in range(2):print "I was washing vegetables. %s" %ctime()
sleep(1)defcook():for i in range(2):print "I was cooking vegetables. %s" %ctime()
sleep(5)if __name__ == '__main__':
wash()
cook()print "all over %s" %ctime()
$ I was washing vegetables. Tue Dec 1 17:52:37 2020$ I was washing vegetables. Tue Dec1 17:52:38 2020$ I was cooking vegetables. Tue Dec1 17:52:39 2020$ I was cooking vegetables. Tue Dec1 17:52:44 2020
$ all over Tue Dec 1 17:52:49 2020
先洗菜,通过for循环来控制洗了两次,每次需要1秒钟,sleep()来控制洗菜的时长。接着我们开始炒菜,
每个菜需要5秒钟,这里炒了两个。在整过程结束后,我通过
print "all over %s" %ctime()
看了一下当前时间,执行结果如上。
其实上面的实例就是单线程,每件事必须先后的执行,不能同时执行。
多线程
在我们生活中,存在很多,我们可以吃着东西看着电影,骑着车,听着音乐,这种并行的动作,
Python3 线程中常用的两个模块为:
_thread
threading(推荐使用)
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。
threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAliv