python如何支持并发方法详解

 更新时间:2020年07月25日 15:20:23   作者:oaksharks  
这篇文章主要介绍了python如何支持并发,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

由于GIL(Global Interpreter Lock)的存在使得在同一时刻Python进程只能使用CPU的一个核心,也就是对应操作系统的一个
内核线程,对于一个Python web程序,如果有个请求,并且都是长耗时的计算任务(占用),这个程序在接受第一个请求后
还能处理别的请求么?假如web程序接受到请求就while True了:

def handle_request(request):
 while True:
  pass

从代码上理解,Python只有一个真正的执行线程,代码走到while True就占用唯一的一个cpu核心了,它还有机会处理
别的任务么?

来启动两个线程都进行while True ,观察他们是否都能执行来模拟那两个请求:

import time, threading

def f1(name):
 while True:
  print(name)
  time.sleep(1)

threading.Thread(target=f1, args=('f1', )).start()
threading.Thread(target=f1, args=('f2', )).start()

输出结果:

f1
f2
f2f1

f2
f1
...

实际上使用Django(一个Python Web 框架)测试,即使一个请求执行了while True这样的代码,它还是可以处理别的请求(支持并发);

来解释一下为什么两个while True 都能执行:
还是用GIL这把锁,第一个while True的线程拿到这把锁才能执行,然后它执行了一个print(name)接着把锁释放了,
它就暂停了,接着第二个while True线程拿到GIL后开始执行,围绕GIL交替执行,就实现了Python的多线程。

总结一下:

while True也不能一直持有CPU资源,它也是执行一会歇一会,这就给了其他进程机会,这里面有两个关键点:

  • 如何抢到这把锁
  • 如何释放锁

抢锁,排队。给lock安排一个队列,想执行的进这个队列。

释放锁的有点类似进程调度:

  • 划分时间片(执行一样的时间)
  • 执行指令计数(执行一样的指令次数)
  • 碰到IO操作(被动等待)
  • 主动等待(wait/join/sleep)

碰到IO操作,需要等待IO设备完成计算才能继续执行线程,这段时间内不占用CPU资源,先把锁释放了。
主动等待,典型的就是sleep,主动放弃锁,等到一定时机再重新执行。

以上分析 说明Python支持并发,但是由于无法利用多核处理器优势,对于大量并发下的计算密集型应用
不适合使用Python。

到此这篇关于python如何支持并发的文章就介绍到这了,更多相关python支持并发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现k-means算法

    Python实现k-means算法

    这篇文章主要为大家详细介绍了Python实现k-means算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • python中获得当前目录和上级目录的实现方法

    python中获得当前目录和上级目录的实现方法

    这篇文章主要介绍了python中获得当前目录和上级目录的实现方法,需要的朋友可以参考下
    2017-10-10
  • Python OpenCV实现传统图片格式与base64转换

    Python OpenCV实现传统图片格式与base64转换

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,本文主要介绍了Python OpenCV实现传统图片格式与base64转换,感兴趣的可以参考一下
    2021-06-06
  • Python加速程序运行的方法

    Python加速程序运行的方法

    这篇文章主要介绍了Python加速程序运行的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 详解python-图像处理(映射变换)

    详解python-图像处理(映射变换)

    这篇文章主要介绍了python-图像处理(映射变换),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Python 转换文本编码实现解析

    Python 转换文本编码实现解析

    这篇文章主要介绍了Python 转换文本编码实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-08-08
  • 详解js文件通过python访问数据库方法

    详解js文件通过python访问数据库方法

    在本篇内容里小编给大家分享了关于js文件通过python访问数据库方法和技巧,有需要的朋友们跟着学习参考下。
    2019-03-03
  • 详解Python使用apscheduler定时执行任务

    详解Python使用apscheduler定时执行任务

    在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站的程序等等,都涉及到了关于定时任务的问题,所以就找到了python的定时任务模块
    2022-03-03
  • 用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知

    用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知

    这篇文章主要介绍了用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知,文中详细的介绍了代码示例,具有一定的 参考价值,感兴趣的可以了解一下
    2023-03-03
  • Python包管理工具pip的15 个使用小技巧

    Python包管理工具pip的15 个使用小技巧

    python的大多数扩展包,都可以使用pip来自动安装。所以pip还是有很多小技巧的。这篇文章主要给大家介绍了关于Python包管理工具pip的15 个使用小技巧,需要的朋友可以参考下
    2021-05-05

最新评论