1.GIL(理论 重点)
2.线程池 进程池
3.同步 异步 GIL
是一个全局解释器锁,是一个互斥锁
为了防止竞争解释器资源而产生的 为何需要gil:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程 都要执行代码
多线程之间要竞争解释器 一旦竞争就有可能出现问题 带来的问题:同一时间只有一个线程可以访问解释器
好处:保证了多线程的数据安全 thread-safe 线程安全的 多个线程同时访问也不会出问题
not thread-safe 非线程安全的 多个线程同时访问可能会出问题(加锁) 默认情况下一个进程只有一个线程 不会出现问题的 但是不要忘记还有GC线程
一旦出现多个线程就可能出问题 所以当初就简单粗暴的加上了GIL锁 如果你的应用程序是大量的IO操作 GIL的影响是微乎其微的
如果你的应用程序时一个大量计算操作 GIL的影响是非常大的 完全无法利用多核cpu
由于有GIL的存在 即使有多个cpu 也不能真正的并行

有三个任务 三个任务要并发执行 是效率最高
1.多进程
2.同一个进程下多线程 只有一个cpu
如果3个任务都要等待IO
如果是采用方案1:由于IO的时间较长 不仅不能提高效率 反而无无谓的增加了系统开销
方案2 更好 有三个cpu
如果是采用方案1 并且三个任务都没有IO操作:开启三个进程 并行的来执行 效率更高
如果是采用方案2 并且三个任务都没有IO操作:开启三个线程 必须串行执行 所以效率比进程更低 应用程序分为两种
1.IO密集型 IO操作较多 纯计算较少 采用多线程
from multiprocessing import Process
from threading import Thread,enumerate,current_thread import time
def task():
with open("2.昨日回顾","rt",encoding="utf-8") as f:
f.read() if __name__ == '__main__':
start = time.time() for i in range(100):
Thread(target=task).start() # enumerate是所有的线程
for t in enumerate():
if t != current_thread():
t.join() # ps = []
# for i in range(100):
# p = Process(target=task)
# p.start()
# ps.append(p)
#
# for p in ps:
# p.join() print(time.time()-start)

IO密集型任务


2.计算密集型 计算操作较多 IO较少  采用多进程
from multiprocessing import Process
from threading import Thread,enumerate,current_thread import time
def task():
with open("2.昨日回顾","rt",encoding="utf-8") as f:
f.read() if __name__ == '__main__':
start = time.time() for i in range(100):
Thread(target=task).start() # enumerate是所有的线程
for t in enumerate():
if t != current_thread():
t.join() # ps = []
# for i in range(100):
# p = Process(target=task)
# p.start()
# ps.append(p)
#
# for p in ps:
# p.join() print(time.time()-start)

计算密集型任务


应用场景:
TCP程序 应该采用多线程
纯计算 例如人脸识别 语音识别等 采取多进程 既然已经有锁了 还需要自己加锁吗?
什么情况下需要自己加锁 当多个线程需要共享一个不属于解释器资源时 必须要自己家 不加锁的例子:多个线程要并发修改某一个变量数据 from concurrent.futures import ThreadPoolExecutor 池就是容器
服务器不可能无限的开线程,所以需要对线程数量加以控制,线程池就是帮我么封装了线程数量的控制
以及线程的创建 销毁 任务的分配 使用方法一样的
线程池 在创建时 不会立即开启线程
等到提交任务时 如果没有空闲的线程 并且已存在的线程数量小于最大值 开个新的
线程开启以后就不会关闭了 直到进程全部结束为止
from concurrent.futures import ThreadPoolExecutor
import threading def task():
print("running............") pool = ThreadPoolExecutor(3)
pool.submit(task)
pool.submit(task)
pool.submit(task)
pool.submit(task) print(threading.active_count())
print(threading.enumerate())
import time time.sleep(3)
print(threading.active_count())
print(threading.enumerate())

线程池特征

3.同步 异步 阻塞 非阻塞

    阻塞:程勋运行过程中遇到IO操作 无法继续
非阻塞:程序正在运行中,并且没有遇到IO操作 即使遇到IO也不会阻塞,cpu不会切走 指的是程序的执行状态 指的是发起人武的方式
同步:
在发起任务后必须在原地等待 任务执行完毕 才能继续往下执行
异步:
在发起任务后立即继续往下执行 不需要等待任务的执行结果 异步效率高于同步
发起异步任务的方式 就是线程和进程 同步和阻塞是完全不同的:
阻塞一定是CPU已经切走了
同步虽然也会卡住 但是CPU没切走 还在你的进程中
from concurrent.futures import  ThreadPoolExecutor

pool = ThreadPoolExecutor()

import time

def task(num):
time.sleep(0.5)
print("run.....")
return num ** 2 ress = [] for i in range(10):
res = pool.submit(task,i)
# res.result() 该函数是阻塞 会一直等到任务执行完毕 导致程序串行执行
ress.append(res) # 保证 当我要获取的时候 所有任务都已经执行完毕
pool.shutdown(wait=True) # 该函数也是阻塞函数 # 等到全部完成在获取结果
for i in ress:
print(i.result()) print("over")

同步异步


pool.shutdown(wait=True)该函数也是阻塞函数 关闭线程池
等到全部完成在获取结果

GIL 线程池 进程池 同步 异步的更多相关文章

  1. GIL 线程池 进程池 同步 异步 阻塞 非阻塞

    1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...

  2. python GIL锁、进程池与线程池、同步异步

    一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线 ...

  3. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  4. GIL解释器锁 & 进程池与线程池

    今日内容 GIL 全局解释器锁(重要理论) 验证 GIL 的存在及功能 验证 python 多线程是否有用 死锁现象 进程池与线程池(使用频率高) IO模型 详细参考: https://www.bil ...

  5. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制

    1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 """先进先出 队列"& ...

  6. Python并发编程之线程池&进程池

    引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  7. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  8. GIL 相关 和进程池

    #GIL (global interpreter Lock) #全局解释器锁 :锁是为了避免资源竞争造成数据错乱 #当一个py启动后 会先执行主线程中的代码#在以上代码中有启动了子线程 子线程的任务还 ...

  9. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

随机推荐

  1. Windbg工具使用

    https://www.cnblogs.com/startpoint/p/4194052.html https://www.cnblogs.com/lyl6796910/p/7613664.html ...

  2. laravel的nginx配置

    最近阅读laravel官方文档 发现了关于nginx的推荐配置 Nginx 如果你使用 Nginx ,在你的网站配置中加入下述代码将会转发所有的请求到 index.php 前端控制器. locatio ...

  3. 夜色的 cocos2d-x 开发笔记 02

    本章我们让飞机发射子弹,因此我们要写这样一个方法 子弹资源:欢迎下载 很详细的注释吧,现在有几个地方报错,.h文件里面一定要先声明 这里是本章所有的新方法,你可以一次声明全部,嗯,还有个报错应该是我们 ...

  4. aaS软件的必要特征分析,一定是多租户特性吗

    本篇文章讲述了SaaS软件的必要特征一定是多租户特性?对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买.构建和维护基础设施和应用程序的需要 课课家教育平台提醒各位:本篇文章纯干 ...

  5. COGS 2091. Asm.Def的打击序列

    ★★★   输入文件:asm_lis.in   输出文件:asm_lis.out   简单对比时间限制:4 s   内存限制:256 MB [题目描述] 白色圆柱形的“蓝翔”号在虚空中逐渐变大,一声沉 ...

  6. linux 下svn同步更新钩子

    svn服务器搭建:https://www.linuxidc.com/Linux/2017-05/144254.htm SVN版本库中的一个项目:/svn/repositories/test/ 网站目录 ...

  7. 【转载】#370 - Subscribe to an Event by Adding an Event Handle

    You subscribe to a particular event in C# by defining an event handler-code that will be called when ...

  8. SpringMVC接受JSON参数详解

    转:https://blog.csdn.net/LostSh/article/details/68923874 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session ...

  9. 2018.7.31 oracle rownum的理解

    一.Rownum的描述: rownum是一个伪列,数据库中并不保存rownum的列值,它是oracle系统为返回的结果集顺序分配的行编号,rownum是随着结果集生成的,一旦生成,在同一个结果集中就不 ...

  10. 20145238-荆玉茗 《Java程序设计》第四次实验报告

    20145238<Java程序设计>第四次实验报告 实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建A ...