上两篇文章,我们说到了多任务与多线程,我们形象的将两者比喻成了大工厂和小车间,但是一个工厂只有资源和车间可不行,必须还得有上班工作的工人,也就是我们今天要了解的线程
线程
线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,python的threading模块是对thread做了一些包装,可以更加方便的被使用线程就是车间中的工人,实际干活的也是工人,真正执行程序的还是线程
线程还分为单线程和多线程
单线程
在单线程中程序的执行还是按照计从上往下逐行去执行的,我们平时使用的调用函数就是单线程的一种体现
依旧以上传和下载为例
import time
def upload():
print("开始上传。。。")
for i in range(1,5):
print(f"上传了{'{:.2%}'.format(i / 4)}")
time.sleep(1)
print("上传完毕。。。")
def download():
print("开始下载.......")
for i in range(1,5):
print(f"下载了{'{:.2%}'.format(i / 4)}")
time.sleep(1)
print("下载完毕.......")
upload()
download()
多线程
我们再通过案例来进一步的对多线程进行
import time
import threading
def upload():
print("开始上传.......")
for i in range(1, 5):
print(f"上传了{'{:.2%}'.format(i / 4)}")
time.sleep(1)
print("上传结束.......")
def download():
print("开始下载.......")
for i in range(1, 5):
print(f"下载了{'{:.2%}'.format(i / 4)}")
time.sleep(1)
print("下载完毕.......")
def main():
upload_thread=threading.Thread(target=upload)
down_thread=threading.Thread(target=download)
upload_thread.start()
down_thread.start()
if __name__ == '__main__':
main()
看到这里我们得明白一个程序的执行必然有一个线程,这个线程是主线程,还得明白一个问题,一个程序的执行必然有一个进程,这个进程是主进程
当我们想要查看线程的数量的时候,我们可以利用 threading.enumerate() 方法
线程的特点
1.线程执行代码的封装
通过使用threading模块能够完成多任务的程序开发,为了让每个线程的封装性更完美所以使用threading模块时,往往会自定义一个新的子类class,只要继承threading.Thread即可实现,一般情况下一个线程中的入口函数是run
2.多线程共享全局变量
在一个函数中对全局变量进行修改的时候,到底是否需要看是否对全局变量的执行进行了引用修改,如果修改了引用,也就是说让全局变量指向了一个新的地方,如果仅修改了引用的数据,此时不用担心变量被分化