python之线程

JoinableQueue

可以被join的队列

join是等待任务结束

队列怎么叫结束?

​ 调用task_done一次则表示有一个数据被处理完成了 当task_done次数等于put的次数就意味着任务处理完成了

​ 这也是join的执行时机

该队列可以明确告知数据的使用方,所有数据都已经处理完成

在生产者消费者模型中,解决了消费者不知道何时算是任务结束的问题

具体过程:主进程先等待所有的生产者进程生成完毕,再等队列中的数据被全部处理,这就意味着,任务全部结束

# 多线程

​ 使用多线程 多进程的目的 是一致 ,都是为了并发执行任务,从而提高效率

​ 什么是线程:

线程是操作系统运算调度的最小单位 (CPU最小执行单位),线程被包含在进程中,一个线程就是一个固定的执行流程 (控制流)

​ 线程的特点:

​ 进程是不能被执行,进程是一个资源单位,其中包含了程序运行所需要的所有资源,

​ 线程才是真正的执行单位,光有进程程序是无法运行的,必须先创建进程将资源加载到进程中,在启动线程来执行任务

​ 一个进程至少包含一个线程,称之为主线程,主线程是由操作系统来开启,

​ 一个进程可以包含多个线程,来提高程序的效率

​ 线程与进程的区别:

​ 线程创建的开销远小于进程

​ 统一进程中的所有线程共享进程内的资源

​ 线程之间没有父子关系,都是平等的,PID相同

如何选择:

​ 要根据具体的任务类型,IO密集 计算密集

## 线程的使用方法与进程一模一样

开启线程的位置可以是任何位置

# 守护线程

​ 守护线程会在所有非守护线程结束时一起结束 ,当然守护可以提前结束

# 线程安全问题

​ 并发操作同一个资源 可能导致数据错乱的问题

​ 解决方案: 加互斥锁

​ 互斥锁 mutex

​ 递归锁 Rlock 同一线程可以多次执行acquire()

​ 信号量 semaphore

​ 死锁问题:

​ 不止一个锁,分别被不同线程持有,相互等待对方释放,就会导致锁死问题

原文地址:https://www.cnblogs.com/huanghongzheng/p/10979562.html