Python多线程详解
python中的多线程是一个非常重要的知识点,但python 默认是单任务,所以今天简单的介绍一下多线程。
什么是线程:
- 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
- 线程是进程中的一个实体,是CPU调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
- 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
主线程:当⼀个程序启动时,就有⼀个进程被操作系统(OS)创建,与此同时⼀个线程也⽴刻运 ⾏,该线程通常叫做程序的主线程
主线程的重要性:
- 是产生其他子线程的线程
- 通常它必须最后完成执行各种关闭动作
子线程:可以看做是程序执⾏的⼀条分⽀,当⼦线程启动后会和主线程⼀起同时执⾏
使用threading .Thread(target=函数名,args=(参数列表,元组))创建子线程对象
那究竟什么是多线程呢,通过下面的例子很容易就搞懂了。
假如你要烧水和拖地还有玩游戏,一共三个任务,如果是单线程来处理这三个任务的话,先烧水,等水烧开,再拖地,然后才能玩游戏。这样等待水烧开的时间就白白浪费了,倘若事交给多线程来做的话,就先烧水,烧水的过程中(相当于IO操作的时候)把时间资源让出来给拖地和玩游戏,当拖完地且玩完游戏后水也烧好了,这个就是多线程的优势。
我们分别来看一下单线程和多线程的实现:
单线程:
import time
def mop_floor():
print('我要拖地了')
time.sleep(1)
print('地拖完了')
def game():
print('我要玩游戏')
time.sleep(4)
print('游戏结束了')
def heat_up_watrt():
print('我要烧水了')
time.sleep(6)
print('水烧开了')
start_time = time.time()
heat_up_watrt()
mop_floor()
game()
end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time))
结果如下:
多线程:
import threading
import time
def mop_floor():
print('我要拖地了')
time.sleep(1)
print('地拖完了')
def game():
print('我要玩游戏')
time.sleep(4)
print('游戏结束了')
def heat_up_watrt():
print('我要烧水了')
time.sleep(6)
print('水烧开了')
start_time = time.time()
t1 = threading.Thread(target=heat_up_watrt)
t2 = threading.Thread(target=mop_floor)
t3 = threading.Thread(target=game)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time))
结果如下:
可以看到烧水等待的时候直接执行拖地任务,并且总共耗时为6秒,比上面的单线程节省了近一半的时间。
关于这里的start和jion都是固定的操作套路,记住这两个代词以后直接套用即可,需要注意的是多线程程序的执行顺序是不确定的。
当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度的命令执行另一个子线程,线程调度将自行选择一个线程执行。
如有错误,欢迎私信纠正,谢谢支持!
本文来自博客园,作者:杨业壮,转载请注明原文链接:https://www.cnblogs.com/yang-yz/p/16896978.html