python多线程类函数 python多线程函数返回值( 二 )


Python 提供了 threading 模块来实现多线程:
因为新建线程系统需要分配资源、终止线程系统需要回收资源,所以如果可以重用线程,则可以减去新建/终止的开销以提升性能 。同时,使用线程池的语法比自己新建线程执行线程更加简洁 。
Python 为我们提供了 ThreadPoolExecutor 来实现线程池,此线程池默认子线程守护 。它的适应场景为突发性大量请求或需要大量线程完成任务,但实际任务处理时间较短 。
其中max_workers 为线程池中的线程个数,常用的遍历方法有 map 和 submit+as_completed。根据业务场景的不同,若我们需要输出结果按遍历顺序返回,我们就用 map 方法,若想谁先完成就返回谁,我们就用 submit+as_complete 方法 。
我们把一个时间段内只允许一个线程使用的资源称为临界资源,对临界资源的访问,必须互斥的进行 。互斥,也称间接制约关系 。线程互斥指当一个线程访问某临界资源时,另一个想要访问该临界资源的线程必须等待 。当前访问临界资源的线程访问结束,释放该资源之后 , 另一个线程才能去访问临界资源 。锁的功能就是实现线程互斥 。
我把线程互斥比作厕所包间上大号的过程,因为包间里只有一个坑,所以只允许一个人进行大号 。当第一个人要上厕所时,会将门上上锁,这时如果第二个人也想大号 , 那就必须等第一个人上完,将锁解开后才能进行,在这期间第二个人就只能在门外等着 。这个过程与代码中使用锁的原理如出一辙,这里的坑就是临界资源 。Python 的 threading 模块引入了锁 。threading 模块提供了 Lock 类,它有如下方法加锁和释放锁:
我们会发现这个程序只会打印“第一道锁” , 而且程序既没有终止,也没有继续运行 。这是因为Lock 锁在同一线程内第一次加锁之后还没有释放时 , 就进行了第二次 acquire 请求 , 导致无法执行 release ,所以锁永远无法释放,这就是死锁 。如果我们使用 RLock 就能正常运行,不会发生死锁的状态 。
在主线程中定义Lock 锁 , 然后上锁,再创建一个子 线程t 运行 main 函数释放锁 , 结果正常输出,说明主线程上的锁,可由子线程解锁 。
【python多线程类函数 python多线程函数返回值】如果把上面的锁改为RLock 则报错 。在实际中设计程序时,我们会将每个功能分别封装成一个函数,每个函数中都可能会有临界区域,所以就需要用到 RLock。
一句话总结就是Lock 不能套娃,RLock 可以套娃; Lock 可以由其python多线程类函数他线程中的锁进行操作, RLock 只能由本线程进行操作 。
python之多线程 进程的概念:以一个整体的形式暴露给操作系统管理python多线程类函数 , 里面包含各种资源的调用 。对各种资源管理的集合就可以称为进程 。
线程的概念:是操作系统能够进行运算调度的最小单位 。本质上就是一串指令的集合 。
进程和线程的区别:
1、线程共享内存空间python多线程类函数 , 进程有独立的内存空间 。
2、线程启动速度快,进程启动速度慢 。注意:二者的运行速度是无法比较的 。
3、线程是执行的指令集,进程是资源的集合
4、两个子进程之间数据不共享,完全独立 。同一个进程下的线程共享同一份数据 。
5、创建新的线程很简单,创建新的进程需要对他的父进程进行一次克隆 。
6、一个线程可以操作(控制)同一进程里的其他线程,但是进程只能操作子进程
7、同一个进程的线程可以直接交流,两个进程想要通信,必须通过一个中间代理来实现 。

推荐阅读