线程

joinableQueue
与普通的Queue没区别 多了两个方法 task_done join
task_done是告诉容器已经处理完了一个数据
join是阻塞函数 等到队列中的数据被处理完毕 (task_done的调用次数等于队列中的数据数量)

线程:
线程指的是一条流水线,整个执行过程的总称
线程是CPU的最小执行单位,是具体负责执行代码的

进程是一个资源单位,其中包括了该程序运行所需的所有资源

线程的特点:
一个进程中至少包含一个线程,是由操作系统自动创建的 称之为主线程
一个进程中可以有任意数量的线程
创建线程的开销对比进程而言 要小得多
同一个进程中的线程间数据是共享的(最主要的特点)


如何使用:使用的方式与进程一致
from threading import Thread 导入模块
开启线程速度比开启进程快很多
两种使用方法和进程一样
实例化一个对象与集成Thread类然后覆盖run方法
创建线程不需要加入到main判断下面.
主线程任务执行完毕后 进程不会立即结束 ,会等待所有子线程执行完毕才会结束
在同一个进程中 所有线程都是平等的 没有子父这么一说
无论创建多少个子线程,pid都不会变.

线程安全问题
线程安全也是通过锁来保证,锁的用法和进程一样
死锁:
在使用锁时,很有可能出现死锁问题
出现死锁问题原因:
1.对同一把锁调用了多次 acquire 导致死锁问题 最low的死锁问题
应该避免在代码中使用这种写法
2.建了两把锁,每个方法都使用到了两把锁但是有两个对象,每个对象都抢到了一把锁
所以就出现了死锁问题
如何避免:
1.能不加锁就不加
2.如果一定要加锁,要保证锁只有一把

RLock(可重入锁):
不能解决死锁问题 只能解决锁的多次调用造成死锁的问题

信号量:
限制有多少线程可以并发访问
不是用来处理线程安全问题

守护线程
守护线程会在主线程结束后立即结束 即使任务没有完成
主线程 会等待所有子线全部完成 后结束
守护线程会在所有非守护线程结束后 结束

主线 守护线程
主线程要等待所有子线结束
posted @ 2019-03-07 19:02  XSHUshu  阅读(234)  评论(0编辑  收藏  举报