第十二篇:线程和进程
Posted littlefivebolg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二篇:线程和进程相关的知识,希望对你有一定的参考价值。
本篇先介绍多任务的概念、随后介绍关于threading模块下thread类创建子线程的流程以及理解,最后关于互斥锁。死锁以及如何避免死锁等知识。而关于进程在下一篇进行介绍。
一、概念
在了解多任务或者线程等知识之前,我们首先需要对一些概念性知识有一定的了解。
1、时间片轮转
假如终端为单核CPU,而同时我又想同时运行多个程序,通常我们能看到单核的CPU也能同时运行多个程序,那是由于操作系统对CPU调用进行分配时,每个程序占用CPU的时间很短很短,接着便开始下一个程序的运行,周而复始的运行这些程序,由于每个程序占用CPU的时间特别短故呈现给我们的现象是:多个程序同时运行的假象。
2、并发
当CPU的数量小于运行程序的数量时,无法是实现真正意义上的每个程序的同时运行,故还是利用时间片轮转原理制造每个程序同时运行的假象,即为并发。
3、并行
当CPU的数量大于等于运行程序的数量时,可以实现每个程序一直均占有一个CPU,实现真正意义上的每个程序同时运行,即为并行。
4、主线程
当我们执行一段程序时,会有一条类似流水线的流程,按照程序的执行顺序不断执行,而在执行的过程主线程可以创建子线程,而通常而言主线程会等所有子线程均运行完才会结束运行,若主线程死掉,所有的子线程也会被杀死。
5、子线程
子线程可以通过主线程创造,同时子线程运行结束或者被杀死,不会影响主线程的执行。
二、线程
1、为什么要有线程?我们从例子开始查看:
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def sing():# 唱歌 for i in range(3): print("he is singing song..") time.sleep(1) def dance(): #跳舞 for i in range(3): print("he is dancing..") time.sleep(1) def main(): sing() dance() if __name__=="__main__": main()
注:从上面的例子可以看出:在没有多线程的情况下,只能先唱完歌再进行跳舞,然而我们要实现的是边唱歌边跳舞
#!/usr/bin/env python # -*- coding:utf-8 -*- import time import threading def sing(): """唱歌""" for i in range(3): print("he is singing song..") time.sleep(1) def dance(): """跳舞""" for i in range(3): print("he is dancing..") time.sleep(1) def main(): # 1.创建子线程对象,并且指定子线程的工作函数 # 即相当于 公司招了个员工,告诉他需要干的活 t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) # 2、子线程运行,并工作函数开始工作 # 相当于该员工开始工作 t1.start() t2.start() # 3、主线程等子线程运行完才关闭 t1.join() t2.join() if __name__=="__main__": main()
注:通过上述例子可以得出:通过多任务的实现了唱歌的同时也进行了跳舞。
2、创建线程的流程是怎么样的?
import time,threading def sing(): for i in range(3): print("he is singing song..") time.sleep(1) def dance(): for i in range(3): print("he is dancing..") time.sleep(1) def main(): # 1.创建子线程对象,并且指定子线程的工作函数 # 即相当于 公司招了个员工,告诉他需要干的活 t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) # 2、子线程运行,并工作函数开始工作 # 相当于该员工开始工作 t1.start() t2.start() # 3、主线程等子线程运行完才关闭 t1.join() t2.join() #注:通过多任务的实现了唱歌的同时也进行了跳舞。 if __name__=="__main__": main()
个人理解:
注:其实主线程和子线程的关系我们可以理解为: 1、主线程相当于一个公司的运转,而子线程相当于该公司下的一个员工正在进行的工作; 2、创建子线程的过程即t1=threading.Thread(target=func_name,args=(para1,para2..),我们可以理解为该公司雇佣了新的员工;而target=func_name,相当于告诉该员工他需要干的活是什么即传入功能函数; 3、而t1.start(),则表示该子线程真正运行,功能函数被调用,该过程可以理解为员工开始干活了,即员工的工作才是子线程,而员工本身仅仅是子线程对象。 |
以上是关于第十二篇:线程和进程的主要内容,如果未能解决你的问题,请参考以下文章