教你学习: Python-100-Days-13 进程与线程
本项目是参考项目内容,进行个人理解,和原有项目有出入,如想了解详情,请自行百度去搜索项目
今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。
1、线程与进程
线程是任务调度的最小执行单位,我们可以为员工,每一个线程都是一个员工,当领导安排任务,他就要去按照规定执行,如果中间出现了意外,员工就死里,也就是我们常说的异常,出现异常一般伴随的就是这个线程的中断。
进程,可以理解为一个工程,我们在完成一个工程的时候需要不同的工种的工人,不管工种怎么变,只要工程还要继续做,工人可以随便换,铁打的硬盘流水的病。
下图就是进程
线程,我们既然理解成为一个员工,员工有生老病死,那么我们这个线程也有一个完整的生命周期。
上面是引用了java语言的,网上导图,只作为参考,线程有几个状态
新建: 一个人的出生,
就绪: 我们开始9年义务教育一点一点的长大
运行: 我们开始进入工程中,工程给我们安排工作我们开始一天一天的工作,有时候公司没钱了,我们就休息几天(阻塞)
死亡: 我们正常干完工作,到老了自然死亡。中间出现意外Exception 异常死亡
2、多进程
随着社会的发展,我们开始进入工业化,老板开始要求公司效率,要求多个工程一起执行,不能等一个工程结束了,下一个工程才开始,所有引入了多进程
Unix和Linux操作系统上提供了fork()系统调用来创建进程,调用fork()函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。fork()函数非常特殊它会返回两次,父进程中可以通过fork()函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了fork()函数。由于Windows系统没有fork()调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的Process类来创建子进程,而且该模块还提供了更高级的封装,例如批量启动进程的进程池(Pool)、用于进程间通信的队列(Queue)和管道(Pipe)等。
通过多进程指定,相同的任务,提高了我们的时间。
3、多线程
随着社会的发展,我们开始进入工业化,老板开始要求公司效率,要求很多人都一起干一件事情,提高效率,我们为了满足老板的要求,开始出现一起进入工厂,流水线工作,多线程工作。
在Python早期的版本中就引入了thread模块(现在名为_thread)来实现多线程编程,然而该模块过于底层,而且很多功能都没有提供,因此目前的多线程开发我们推荐使用threading模块,该模块对多线程编程提供了更好的面向对象的封装。我们把刚才下载文件的例子用多线程的方式来实现一遍。
细心的同学就发现,我们这里是用join来解决的线程通信问题,这是被动的是需要主线程来管理的,那我们能不能通过app告诉线程,进行统一管理,这个app就是全局变量,
全局变量,就是大家都可以共享看见的内容,就和共享单车一样,登录app,大家都知道哪里有车,哪里没有车。
最终我们未了解决线程之间通讯的问题,引入CAS的概念,CAS概念的具体实现就lock锁
CAS 就我们A线程,B线程一起打游戏,A打到第二关了,告诉裁判我打到第二关了,B线程打到第二关,告诉裁判,却被告知A已经打到第二层了,自己要是想赢还要继续努力。
这就是CAS,通过一个共享变量,A和B 每次完成都要和裁判去确定一下消息。
lock 线程锁,是一种乐观锁
例子: 我们一起去抢购,A冲进去买东西,B和其他的就需要等着,A抢购完了,保安告诉其他人,A买完了,你们继续冲,谁抢到了,谁第二个进去买,其他人继续等。。。
4、NIO
nio 异步线程通信,我们上面所说的单线程和多线程都属于io ,同步线程通信
区别: io,我干一件事必要等执行完了,出来结果,我再去干别的事
Nio, 我把材料给了公司了,等公司加工出成品了,我再来拿。
进程与线程是计算机基础,是非常重要的一块,今天介绍的只能说是最基础的部分,
多线程的异步同喜,并发控制,AQS,CAS 概念,悲观锁,乐观锁等,本篇只是帮助大家
到进程和线程有个初步了解。
如果喜欢请关注,您的关注是我写作的动力。