GIL锁,线程池,同步异步

1.GIL    是一个全局解释器锁 ,是一种互斥锁

    为什么需要GIL:因为一个python.exe进程中只有一分解释器,如果这个进程开启了多个线程都要执行代码        多线程之间要竞争解释器,一旦竞争就有可能出现问题

    带来的问题:同一时间只有一个线程可以访问解释器    好处:保证了多线程的数据完全

    thread-safe  线程安全的  多个线程同时访问也不会出问题    not thread-safe 非线程安全的 多个线程同时访问可能会出问题 (加锁)

    默认情况下一个进程只有一个线程 是不会出现问题的 ,但是不要忘记还有GC线程    一旦出现多个线程就可能出问题 ,所以当初就简单粗暴的加上了GIL锁

    那么多线程是不是完全没有意义?    由于有GIL的存在 即使有多个CPU 也不能真正的并行

    有三个任务   三个任务要并发执行 使效率最高    1.多进程    2.同一个进程下多线程

    只有一个CPU        如果3个任务都要等待IO        如果是采用方案1: 由于IO的时间较长 不仅不能提高效率 反而无谓的增加了系统开销        方案2 更好

    有三个CPU        如果是采用方案1 并且三个任务都没有IO操作: 开启三个进程 并行的来执行 效率更高        如果是采用方案2 并且三个任务都没有IO操作: 开三个线程  必须串行执行 所以效率比进程更低

    应用程序分为两种    1.IO密集型   IO操作较多 纯计算较少   采用多线程    2.计算密集型 计算操作较多 IO较少     采用多进程

    应用场景:        TCP程序  应该采用多线程        纯计算 例如人脸识别 语音识别等  采取多进程

    GIL    是什么   为什么出现  如何解决其带来的效率问题

    既然已经有锁了 还需要自己加锁吗?        什么情况需要自己加锁  当多个线程需要共享一个不属于解释器的资源时 必须要自己加        不用加锁的例子: 多个线程要并发修改某一个变量数据

2.线程池 进程池    池就是容器    服务器不可能无线的开线程 ,所以需要对线程数量加以控制,线程池就是帮我们封装了线程数量的控制  以及 线程的创建  销毁 任务的分配    使用方法一样的

    特点:        线程池 在创建时不会立即开启线程        等到提交任务时  如果没有空闲线程 并且已存在的线程数量 小于最大值 开个新的        线程开启以后就不会在关闭了  直到进程全部结束为止

3.同步 异步  阻塞 非阻塞  阻塞: 程序运行过程中遇到IO操作 无法继续  非阻塞: 程序正在运行中,并且没有遇到IO操作,即时遇到IO也不会阻塞,CPU不会切走

  指的是程序的执行的状态

  指的是发起任务的方式  同步:      在发起任务后必须在原地等待 任务执行完毕 才能继续往下执行

  异步:      在发起任务后立即继续往下执行,不需要等待任务的执行结果      结果上哪去获取      shutdown(wait=True) 这个方法能够知道池里面的线程是否全部完成      在判断线程都完成之后就输出结果:          池有一个一个方法result 可以输出所有结果

  异步效率高于同步    发起异步任务的方式 就是线程和进程

  同步和阻塞 是完全不同的:      阻塞一定是CPU已经切走了      同步虽然也会卡住 但是CPU没切走 还在你的进程中

原文地址:https://www.cnblogs.com/xiezuodd/p/10496409.html

时间: 2024-07-30 18:52:47

GIL锁,线程池,同步异步的相关文章

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

目录 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 2.死锁现象与递归锁 2.1死锁现象 2.2递归锁 3.信号量 4.GIL全局解释器锁 4.1背景 4.2为什么加锁 5.GIL与Lock锁的区别 6.验证计算密集型IO密集型的效率 6.1 IO密集型 6.2 计算密集型 7.多线程实现socket通信 7.1服务端 7.2客户端 8.进程池,线程池 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 #生产者消

30分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的.进程可以理解为一个程序的基本边界.是

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步、异步、阻塞、非阻塞

27 Apr 18 一.全局解释器锁 (GIL) 运行test.py的流程: a.将python解释器的代码从硬盘读入内存 b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码) c.将test.py中的代码像字符串一样读入python解释器中解析执行 1 .GIL:全局解释器锁 (CPython解释器的特性) In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

GIL 线程池 进程池 同步 异步

1.GIL(理论 重点)2.线程池 进程池3.同步 异步 GIL 是一个全局解释器锁,是一个互斥锁 为了防止竞争解释器资源而产生的 为何需要gil:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程 都要执行代码 多线程之间要竞争解释器 一旦竞争就有可能出现问题 带来的问题:同一时间只有一个线程可以访问解释器 好处:保证了多线程的数据安全 thread-safe 线程安全的 多个线程同时访问也不会出问题 not thread-safe 非线程安全的 多个线程同时访问可能

python GIL锁 锁 线程池 生产者消费模型

python的GIL 锁 python内置的一个全局解释器锁 , 锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度 为什么有这把GIL锁? python语言的创始人在开发这门语言时 , 目的快速把语言开发出来 , 如果加上GIL锁(C语言加锁) , 切换时按照100条字节指令来进行线程间的切换 锁 : 1.锁 : Lock(1次放1个) 线程安全 , 多线程操作时 , 内部会让所有线程排队处理 , 如 : list / dict / Queue 线程不安全 + 人  =>排队处理

线程池和异步线程

目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程 5 异步线程的工作过程和几个重要的元素 6 有必要简单介绍下Classic Async Pattern 和Event-based Async Pattern 7 异步线程的发展趋势以及.net4.5异步的简化 8 本章示例 自定义一个简单的线程池 Asp.net异步IHttpAsyncHandler示例 9 本章总结 1 什么是CLR线程池? 在上一章中

Android性能优化之使用线程池处理异步任务

说到线程,我想大家都不陌生,因为在开发时候或多或少都会用到线程,而通常创建线程有两种方式: 1.继承Thread类 2.实现Runnable接口 虽说这两种方式都可以创建出一个线程,不过它们之间还是有一点区别的,主要区别在于在多线程访问同一资源的情况下,用Runnable接口创建的线程可以处理同一资源,而用Thread类创建的线程则各自独立处理,各自拥有自己的资源. 所以,在Java中大多数多线程程序都是通过实现Runnable来完成的,而对于Android来说也不例外,当涉及到需要开启线程去完

Android 性能优化之使用线程池处理异步任务

说到线程,我想大家都不陌生,因为在开发时候或多或少都会用到线程,而通常创建线程有两种方式: 1.继承Thread类 2.实现Runnable接口 虽说这两种方式都可以创建出一个线程,不过它们之间还是有一点区别的,主要区别在于在多线程访问同一资源的情况下,用Runnable接口创建的线程可以处理同一资源,而用Thread类创建的线程则各自独立处理,各自拥有自己的资源. 所以,在Java中大多数多线程程序都是通过实现Runnable来完成的,而对于Android来说也不例外,当涉及到需要开启线程去完