XYM个人博客对应篇章


meinheld + gunicorn + flask 是神器啊,小小研究了一下。

【Coroutine】

Coroutine:协程,又称微线程,纤程。
协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。

python中的yield和第三方库greenlet,都可以实现协程。
greenlet 提供了在协程中直接切换控制权的方式,比生成器(yield)更加灵活、简洁。

【GIL】

  1. 线程安全是在多线程的环境下,线程安全能够保证多个线程同时执行时程序依旧运行正确,而且要保证对于共享的数据,可以由多个线程存取,但是同一时刻只能有一个线程进行存取。每一个interpreter进程,只能同时仅有一个线程来执行,获得相关的锁,存取相关的资源。那么很容易就会发现,如果一个interpreter进程只能有一个线程来执行,多线程的并发则成为不可能,即使这几个线程之间不存在资源的竞争。
  2. 所以虽然 CPython的线程库直接封装操作系统的原生线程,但CPython进程做为一个整体同一时间只会有一个获得了GIL的线程在跑,其它的线程都处于等待状态等着 GIL的释放。所以只能使用cpu单核。这也是python多线程被人诟病的原因。python的高并发更加推荐多进程+协程。

【io多路复用】

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。
1. select(线程不安全):它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
2. poll(线程不安全):它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制
3. epoll(线程安全):epoll可以同时支持水平触发和边缘触发(Edge Triggered,只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能要更高一些,但是代码实现相当复杂。

【meinheld】

meinheld = greenlet + picoev(A tiny, lightning fast event loop for network applications)https://github.com/kazuho/picoev

【gevent】

gevent = greenlet + python.monkey(libevent)

【异步实现】

多进程 + coroutinue + callback(io多路复用做事件驱动)

【picoev和libevent】

meinheld和gevent都能实现异步,但是测评中meinheld比gevent的性能好很多,不过因为meinheld支持的比较少,一般都是配合gunicorn使用的。下面分析一下meinheld和gevent性能差距主要原因,分别使用的是picoev和lievent。

【libevent】

主要实现:使用堆(优先队列)作为timer事件的算法(nlogn),IO和信号的实现均使用了双向队列(用链表实现)。

【picoev】

picoev:根据作者简介,主要优化有两点。
1. 主要是考虑是fd(file descriptors)在un*x中是用比较小的正整数表示的,那么把fd的相关信息,全部存储在一个array中,这样使得查找快速,在操作socket状态时会更加的快。
2. 第二点是对于timer事件的算法优化,通过环形缓冲区(128)和bit vector实现查看部分源码可以看出,主要实现是每个时间点对应的是缓冲区的一个位置,每个缓存区使用bit vector 表示fd的数值,相当于一种hash映射所以时间复杂度为(o(n)),n为那个缓存区所存的fd数量。

---------------------
作者:xymscau
来源:CSDN
原文:https://blog.csdn.net/xymscau/article/details/50490728
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

Meinheld 和 Gevent_XYM相关推荐

  1. Echart.js的趋势图入门与实例

    在平时开发项目时,免不了需要对数据进行图表显示的需求,比如:趋势图.饼状图.柱形图等.自己身为一个PHPer,除了PHP本身的功能,不得不需要借助js来实现显示.在了解众多趋势图插件,国内外开源的项目 ...

  2. Flask中数据库的应用

    一.配置SQLAlchemy 1.安装包 pip install flask-sqlalchemy pip install pymysql 2.配置数据库 a)配置SQLALCHEMY_DATABAS ...

  3. Python库全部整理出来了,非常全面

    库名称简介 Chardet 字符编码探测器,可以自动检测文本.网页.xml的编码. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable 主要用于在终端或浏览器端构 ...

  4. python_web框架

    一.web框架 web框架: 自己完成socket的web框架:如,Tornado等 由WSGI完成socket的web框架:如,Django.flash等 两种实现过程: 第二种WSGI方式的,由于 ...

  5. 1000+ 常用 Python 库一览

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源 | 法纳斯特 这次给大家总结整理了1000+常用Python库 ...

  6. Python全家福,这些库你认识哪些?

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  7. 为什么异步Python比同步Python快?

    在本文中,我将继续使用 Web 应用程序作为例子,但还有其它类型的应用程序也从并发中获益.因此,这个讨论并不仅仅是针对 Web 应用程序的.你是否听人们说过,异步 Python 代码比"普通 ...

  8. 最近のWebSocket事情についてまとめとく

    最近のWebSocket事情についてまとめとく HTML5, WebSocket id:Jxck(@Jxck_)さんからのリクエストもありましたので.現状でのWebSocket情報をまとめておきます. ...

  9. 现代化高效率API接口开发

    接口分类 增删改查接口 业务接口 增删改查接口 主要负责对数据库数据进行增删改查,用户管理,商品管理,订单管理等,主要为后台管理系统接口和配置接口,严格按照RESTful规范编写, 状态码按照标准规范 ...

最新文章

  1. 设计模式 — 创建型模式 — 工厂模式
  2. 5GS 协议栈 — GTP 协议族
  3. 使用 Visual Studio Code 进行远程开发
  4. Phpstorm界面不停的indexing,不停的闪烁
  5. vue+elementUI 添加多个可以全选的多选框
  6. AE物体表面跟踪特效合成高级插件:Lockdown for Mac 支持ae2021
  7. 《Java大学教程》—第23章 Java网络编程
  8. 学会拒绝别人的6个技巧_4个秘诀教你怎么拒绝别人,还能不伤和气
  9. matlab图像处理中的错误--调用imhist报错
  10. 小程序微信支付errcode:40163问题
  11. Java Seckill Project
  12. cv::Mat转换为QImage错误
  13. 征途单机版场景服务器端口被占用,《征途单机版》构架攻略
  14. 操作系统发展趋势分析,以及对开发者的影响。
  15. 词法语法分析器EDG C++
  16. Sketch中的快捷键总结
  17. AR红包Android端实现原理
  18. document.documentElement与document.body
  19. Deepin20.6直接运行exe文件
  20. IBM欧洲裁员一万人、Salesforce 考虑收购 Slack​、杰夫·贝佐斯如何做决定等|Decode the Week...

热门文章

  1. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘s
  2. davfs挂载与使用缺陷
  3. linux下rocksdb的编译安装
  4. 第四篇 做一个用户登录之后查看学员信息的小例子
  5. 曼哈顿交易 - 题解
  6. 查看端口占用情况lsof,并关闭对应进程kill
  7. PHP获取6位数随机数,获取redis里面不存在的6位随机数(设置24小时过时)
  8. android学习——popupWindow 在指定位置上的显示
  9. html中charset和content-language的区别
  10. The Nighth Assignment