pathy编程和python python多线程( 二 )


3、线程是执行的指令集,进程是资源的集合
4、两个子进程之间数据不共享,完全独立 。同一个进程下的线程共享同一份数据 。
5、创建新的线程很简单,创建新的进程需要对他的父进程进行一次克隆 。
6、一个线程可以操作(控制)同一进程里的其他线程,但是进程只能操作子进程
7、同一个进程的线程可以直接交流,两个进程想要通信,必须通过一个中间代理来实现 。
8、对于线程的修改,可能会影响到其他线程的行为 。但是对于父进程的修改不会影响到子进程 。
第一个程序,使用循环来创建线程,但是这个程序中一共有51个线程,我们创建了50个线程,但是还有一个程序本身的线程,是主线程 。这51个线程是并行的 。注意:这个程序中是主线程启动了子线程 。
相比上个程序,这个程序多了一步计算时间,但是我们观察结果会发现,程序显示的执行时间只有0.007秒,这是因为最后一个print函数它存在于主线程,而整个程序主线程和所有子线程是并行的,那么可想而知,在子线程还没有执行完毕的时候print函数就已经执行了,总的来说,这个时间只是执行了一个线程也就是主线程所用的时间 。
接下来这个程序,吸取了上面这个程序的缺点,创建了一个列表,把所有的线程实例都存进去,然后使用一个for循环依次对线程实例调用join方法,这样就可以使得主线程等待所创建的所有子线程执行完毕才能往下走 。注意实验结果:和两个线程的结果都是两秒多一点
注意观察实验结果,并没有执行打印task has done,并且程序执行时间极其短 。
这是因为在主线程启动子线程前把子线程设置为守护线程 。
只要主线程执行完毕,不管子线程是否执行完毕,就结束 。但是会等待非守护线程执行完毕
主线程退出,守护线程全部强制退出 。皇帝死了,仆人也跟着殉葬
应用的场景 : socket-server
注意:gil只是为了减低程序开发复杂度 。但是在2.几的版本上,需要加用户态的锁(gil的缺陷)而在3点几的版本上,加锁不加锁都一样 。
下面这个程序是一个典型的生产者消费者模型 。
生产者消费者模型是经典的在开发架构中使用的模型
运维中的集群就是生产者消费者模型,生活中很多都是
那么,多线程的使用场景是什么?
python中的多线程实质上是对上下文的不断切换,可以说是假的多线程 。而我们知道,io操作不占用cpu,计算占用cpu,那么python的多线程适合io操作密集的任务,比如socket-server,那么cpu密集型的任务,python怎么处理?python可以折中的利用计算机的多核:启动八个进程,每个进程有一个线程 。这样就可以利用多进程解决多核问题 。
python多线程有很多的场景中的事情是同时进行的,比如开车的时候,手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的
结果:
?_thread
?threading(推荐使用)
结果:
threading.enumerate()可查看当前正在运行的线程
结果:
结果:
结果:
结果: 出现资源竞争导致计算结果不正确
(1)当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
(2)线程同步能够保证多个线程安全访问资源,最简单的同步机制是引入互斥锁
(3)互斥锁为资源引入一个状态: 锁定/非锁定
(4)某个线程要更爱共享数据时,先将其锁定,此时资源的状态为"锁定", 其他线程不能更改;直到该线程释放资源,将资源状态变为"非锁定"
(5)互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性
结果: 计算正确
结果:卡住了
在线程间共享多个资源的时候,如果两个线程分别战友一部分资源且同时等待对方资源,就会造成死锁
(1)程序设计时避免(银行家算法)
(2)添加超时时间
python多线程延迟并发python多线程延迟并发的解决方法如下:
1.python之中多线程的特点,实际上是将执行耗时长的任务放在前台,耗时短的任务放在后台,当处理器有空闲时或者是后台任务主动调用时就会将其拿到前台来执行,而在这个过程之中实际上每次还是执行的一个线程 。
2.python多线程延迟并发指的则是当前python程序内有多个程序,也就是任务同时处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 。
3.python多线程延迟并发的好处就在于可以更加合理的去调配资源,因为多线程是使用CPU的多核处理器去完成任务的 。而并发则是在同一处理器上完成任务,多线程实现并发的话就可以提高运行速度并且减少内存占用 。

秒懂生活扩展阅读