Python下篇 1. GIL对异步编程的影响

简介: Python下篇 1. GIL对异步编程的影响

1. 前言



这篇文章重点讲解GIL存在的意义以及问题,同时也说下多线程,多协称以及多进程编程模型中,GIL对于他们的影响,因为参与异步编程的进程,线程和协称都在一定程度上在各自领域发挥作用,如何有效利用内存和CPU才是最关键的,而这就绕不开对GIL的探究,所以这篇文章我们就来了解下GIL对于我们的进程,线程以及协称的影响,欢迎大家关注点赞分享哦。


2. 吃透GIL



本文是以Cpython解释器作为Python解释器讲解。


GIL概念:

GIL是Python中的一个全局解释锁,是Python设计解释器Cpython的一个技术术语,用于在解释器执行Python线程时,锁住当前运行的线程,防止其他线程执行。在这个基础上,你就明白为什么说,Python是单线程的语言了,因为在GIL的限制下,只能同时执行一个线程,所谓的多线程实际上是,线程获取和释放GIL的切换过程,看起来像多线程。


GIL目的:

  1. 内存管理的race condition资源竞争,线程安全的问题
  2. C语言库大部分不是原生线程安全的


3. 进程与GIL的关系



一个Python解释器就是一个进程,所以每个进程只带有一个GIL。如下图所示:

640.png


可不可能多个Python Process 共享一个Interpreter?

就我目前的认知我觉得不可能。而且如果你是用fork从当前process创建新的process,则是明确的不可能,因为fork你可以理解为是一个deep copy,新创建的process内部是一个实打实的interpreter instance 的clone。这也从另一个方面说明,multi-processing 比 multi-threading的overhead消耗要大。


4. 线程与GIL的关系



只有在同一个process内的threads才有竞争关系,需要抢夺GIL来执行代码;不同process下的threads属于八竿子打不着的关系,更不要说去竞争GIL了。如下图所示:

640.png


5. 协称与GIL的关系



其实协称是线程的微缩版,内存开销以及CPU上下文切换开销比线程小而已,再就是它有自己的事件循环调度器,这个事件循环调度器因为GIL的存在只能在一个线程中运行,所以想要高并发的执行请求,调度器必须底层实现多路IO服用模型(selectors模块,之前文章有讲解),这样才能在单线程中实现高并发。


6. 小结



  1. 在CPU密集型计算中推荐使用多进程模型

因为多进程模型可以利用多核CPU并行计算,而且每个进程拥有一个解释器,每个解释器拥有自己的GIL,它们之间互不影响,高效完成CPU计算工作。


  1. 在IO密集型操作中推荐使用多线程模型

因为多线程一定会有GIL的约束,但是Cpython在实现中如果遇到IO操作会主动释放GIL以便其他线程获取GIL,所以在高IO场景中比较推荐多线程模型。


  1. 在高并发编程中推荐使用协称模型

高并发场景中一定是成千上万的请求需要处理,这个时候线程资源的开销是OS无法cover的,所以迫切需要大量的轻量级协称去代替多线程去处理请求。


异步编程要旨就是变同步为异步,你可以去开辟多进程或者多线程异步去处理请求,但是也要考虑各自的使用场景和内存CPU开销,而协称作为异步编程的佼佼者,你只管用就好了,其他的无需担心。

相关文章
|
12天前
|
搜索推荐 程序员 调度
精通Python异步编程:利用Asyncio与Aiohttp构建高效网络应用
【10月更文挑战第5天】随着互联网技术的快速发展,用户对于网络应用的响应速度和服务质量提出了越来越高的要求。为了构建能够处理高并发请求、提供快速响应时间的应用程序,开发者们需要掌握高效的编程技术和框架。在Python语言中,`asyncio` 和 `aiohttp` 是两个非常强大的库,它们可以帮助我们编写出既简洁又高效的异步网络应用。
61 1
|
18天前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
26 0
|
1天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
5天前
|
调度 开发者 Python
异步编程在Python中的应用:Asyncio和Coroutines
【10月更文挑战第12天】本文介绍了Python中的异步编程,重点讲解了`asyncio`模块和协程的概念、原理及使用方法。通过异步编程,程序可以在等待I/O操作时继续执行其他任务,提高整体效率。文章还提供了一个简单的HTTP服务器示例,展示了如何使用`asyncio`和协程编写高效的异步代码。
12 2
|
7天前
|
调度 开发者 Python
异步编程在Python中的应用:Asyncio和Coroutines
【10月更文挑战第10天】本文介绍了Python中异步编程的应用,重点讲解了`asyncio`模块和协程的概念、原理及使用方法。通过一个简单的HTTP服务器示例,展示了如何利用`asyncio`和协程实现高效的并发处理。
14 1
|
8天前
|
调度 开发者 Python
探索Python中的异步编程:从基础到实战
【10月更文挑战第9天】在Python的世界中,异步编程是一个让开发者既能提升应用性能又能保持代码可读性的强大工具。本文将带你一探究竟,从理解异步编程的基本概念开始,到深入剖析其背后的原理,再到通过实际代码示例掌握其应用技巧。无论你是异步编程的新手还是希望深化理解的老手,这篇文章都将为你打开一扇新的大门,让你的项目因使用异步而更加高效和强大。
|
11天前
|
调度 开发者 Python
异步编程在Python中的应用:Asyncio和Coroutines
【10月更文挑战第6天】本文介绍了Python中的异步编程,重点讲解了`asyncio`模块和协程的概念、原理及使用方法。通过示例展示了如何利用`asyncio`和协程编写高效的异步代码,提高程序的性能和响应能力。
15 2
|
11天前
|
调度 开发者 Python
探索Python中的异步编程:从asyncio到Trio
在这个快节奏的技术世界里,Python的异步编程正变得越来越重要。本文将带你深入Python的异步编程世界,从asyncio的基础用法,到Trio的高级特性,我们将一探究竟。准备好,让我们一起揭开Python异步编程的神秘面纱。
|
18天前
|
中间件 API 调度
深入探究 Python 异步编程:利用 asyncio 和 aiohttp 构建高效并发应用
深入探究 Python 异步编程:利用 asyncio 和 aiohttp 构建高效并发应用
14 4
|
17天前
|
程序员 开发者 Python
探索Python中的异步编程:从基础到实战
本文旨在通过浅显易懂的语言和实际代码示例,引导读者了解并掌握Python中的异步编程。我们将从异步编程的基本概念入手,逐步深入到其背后的原理,最后通过一个实战项目来巩固所学知识。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你开启Python异步编程的大门,让你的代码运行得更加高效。