JoinableQueue
可以被join的队列
join是等待任务结束
队列怎么叫结束?
调用task_done一次则表示有一个数据被处理完成了 当task_done次数等于put的次数就意味着任务处理完成了
这也是join的执行时机
该队列可以明确告知数据的使用方,所有数据都已经处理完成
在生产者消费者模型中,解决了消费者不知道何时算是任务结束的问题
具体过程:主进程先等待所有的生产者进程生成完毕,再等队列中的数据被全部处理,这就意味着,任务全部结束
# 多线程
使用多线程 多进程的目的 是一致 ,都是为了并发执行任务,从而提高效率
什么是线程:
线程是操作系统运算调度的最小单位 (CPU最小执行单位),线程被包含在进程中,一个线程就是一个固定的执行流程 (控制流)
线程的特点:
进程是不能被执行,进程是一个资源单位,其中包含了程序运行所需要的所有资源,
线程才是真正的执行单位,光有进程程序是无法运行的,必须先创建进程将资源加载到进程中,在启动线程来执行任务
一个进程至少包含一个线程,称之为主线程,主线程是由操作系统来开启,
一个进程可以包含多个线程,来提高程序的效率
线程与进程的区别:
线程创建的开销远小于进程
统一进程中的所有线程共享进程内的资源
线程之间没有父子关系,都是平等的,PID相同
如何选择:
要根据具体的任务类型,IO密集 计算密集
## 线程的使用方法与进程一模一样
开启线程的位置可以是任何位置
# 守护线程
守护线程会在所有非守护线程结束时一起结束 ,当然守护可以提前结束
# 线程安全问题
并发操作同一个资源 可能导致数据错乱的问题
解决方案: 加互斥锁
互斥锁 mutex
递归锁 Rlock 同一线程可以多次执行acquire()
信号量 semaphore
死锁问题:
不止一个锁,分别被不同线程持有,相互等待对方释放,就会导致锁死问题