Python高并发与高性能编程:原理与实践_周宇凡_AZW3_MOBI_EPUB_PDF_电子书(无页码)_周宇凡
内容节选
第10章线程同步与异步 在前文中,笔者已经穿插着介绍了关于线程同步与异步的部分内容,读者已经对线程同步与异步的相关内容有了一定了解,但是还不够全面。在本章中,笔者将会从线程同步和异步的概念入手,向读者介绍什么是线程同步与异步、线程同步与异步在Python中的实现。 10.1 什么是线程同步与异步 线程同步,即Thread Synchronization,指的是在多线程环境中,线程可以按照一定的顺序进行相同的操作,且在线程执行操作时,其他线程不能参与执行该操作。只有这两点同时具备,才能说我们设计的多线程是同步的。对于Python来说,Python多线程处理任务时,一般是无序的,不能保证线程同步,因为Python中的多线程是被操作系统和CPU统一调度和管理的。线程同步的工作流程概览如图10-1所示。 在图10-1中,假设当前Python环境中存在线程A、B、C,这三个线程都需要访问资源池中的资源,而这个资源池是由操作系统中的临界区进行管理。那么在没有线程同步概念的约束下,上述3个线程获取资源池中的资源时是随机乱序的,如图10-2所示。 上图每个箭头的深入资源池的程度表示在同一时刻3个线程可以访问到资源池中资源的范围。从图10-2可知,对于同一资源的访问,线程C访问到的资源最多,线程B访问到的资源最少,线程A在这两者中间。上述3个线程访问资源的形式反映到Python程序,就是对于同一个操作,执行结果不一致,存在正确的执行结果,也存在不正确的执行结果,或者根本不存在正确的执行结果。当在Python中实现了线程同步之后,上述获取资源的过程就会变成图10-3。 ▲图10-1 线程同步的工作流程概览 ▲图10-2 多线程随机乱序地获取资源 ▲图10-3 Python线程以同步的方式调度资源 当以线程同步的方式访问同一个资源时,上述3个线程就会变得有序,假设优先访问到资源池中的资源的线程是线程A,那么线程A在访问到资源池中的资源后,操作系统和CPU就会等到线程A执行结束后才会让线程B访问到该资源池中的资源,同样,等到线程B执行结束后才会让线程C访问到该资源池中的资源。等到上述3个线程都执行结束,操作系统和CPU会一次性将这三个线程所占有的资源(严格来说是一个线程所占有的资源)进行释放,再等待后续的线程访问。那么,以线程同步的方式来执行Python任务,又是怎样呢?以线程同步的方式来执行Python任务的流程图如图10-4所示。 图10-4 以线程同步的方式来执行Python任务的流程图 以线程同步的方式来执行Python任务的过程和上述以线程同步的方式对线程A、B、C进行调度的方式是一样的,这里不再赘述。 线程异步,即Thread Async,指的是在多线程环境中,线程可以不按照一定的顺序执行相同的操作,而且在线程执行具体的操作时,其他线程可以继续执行其他操作。只有这两点同时具备,才能说我们设计的多线程是异步的。Python原生是没有实现线程异步这个概念的,只是提供了一些可以实现线程同步的工具包和工具类型。相对于线程同步来说,线程异步可以更充分地利用操作系统和CPU的资源,使操作系统对线程的调度可以做到应调尽调,使CPU尽可能不浪费处理线程的时机。相对来说,基于线程异步处理多线程比基于线程同步来处理多线程的速度更快、效率更高,但是在基于线程异步处理多线程时,我们需要确定好线程异步执行的范围和结束条件,切记不能无休止地让线程永远异步执行。线程异步的工作流程概览如图10-5所示。 图10-5 线程异步的工作流程概览 还是设置3个线程A、B、C,假设开发者让线程A执行需要异步执行的代码块,此时,线程A就会获取到对应的资源,代码块在线程A调用后开始执行。同时,线程A在调用这些代码块的结束随之逐步释放掉占用的资源,即线程A在执行了这些代码块后就空闲了下来,可以执行其他的操作了。但是,线程A执行这些代码块后,如果没有返回结果,那么只要这些代码块一经执行就可以达到预期的效果,如果这些代码块是有返回结果的,那么又该如何处理呢? 对于需要接收返回结果的异步执行代码块,开发者在这部分代码开发的时候就需要预留出返回代码执行结果的回调方法,或者采用轮询的方式来获取该代码块的执行结果。 在图10-6中,笔者以异步执行一个耗时任务为例,绘制了线程异步执行需要返回结果的代码块时的处理流程。 图10-6 线程异步执行获取代码返回结果流程 在图10-6中,随着服务请求的到来,执行的耗时任务代码块随即被触发,而执行这一代码块的线程假定就是线程A,线程A在获取对应资源后就会开始异步执行。随着代码块被调用,线程A也随之执行结束,释放所占用的资源。由于耗时任务代码块被触发执行,该代码块就会触发一个轮询机制。随着耗时任务代码块的执行并返回结果,该代码块所对应的轮询机制会主动对到来的服务......
- 信息
- 前言
- 基础篇
- 第1章 Python高级编程所涉及的基础概念
- 第2章 Python 3.X版本简析
- 高并发篇
- 第3章 Python高并发与高性能实现的基本原理
- 第4章 Threading模块详解
- 第5章 Python协程的实现
- 第6章 Python中的线程通信
- 第7章 锁机制及其实现原理
- 第8章 线程安全
- 第9章 线程优先级
- 第10章 线程同步与异步
- 第11章 Python中的原子性
- 第12章 Python线程池的实现
- 高性能篇
- 第13章 Python代码性能优化
- 第14章 基于Profile的性能优化
- 第15章 基于Python的C拓展组件的性能优化
- 实践篇
- 第16章 Python代码实践环境的搭建
- 第17章 高并发环境下的邮件发送功能
- 第18章 高并发环境下的日志打印功能
- 第19章 高并发环境下的用户注册和登录功能
- 附录
- 附录A Django框架快速入门
- 附录B FastAPI框架快速入门
- 推荐阅读