作者:大U哥
链接:https://www.zhihu.com/question/20703476/answer/15911452
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

gevent 比起其他框架(比如tornado,twisted)的一个巨大优势就是:用同步的方法(自然没有回调函数)写异步应用,因为同步的方式更接近开发人员的编程思维。
gevent可以用一句话向pythoner阐述:使用多路IO复用对文件描述符的事件监听,从而撬动协程的“透明”切换。这句话说起来容易,但是阐述起来就复杂些:
  1. 底层(或者说主协程)自然有一个多路IO复用循环(linux上是epoll,unix是kqueue,以下统一用epoll代替描述)
  2. 当处理一个socket链接时,就创建一个协程greenlet去处理。
  3. 当socket遇到阻塞的时候,比如等待数据的返回或者发送,此时gevent做了很关键的两步:
    1. 为这个socket的fd在epoll上添加可读或者可写事件回调,而这个回调函数便是 gevent.getcurrent().switch
    2. 通过 get_hub().switch() 切换到主协程。切换回主协程,去干其他事情了。但是当该socket可读或者可写,epoll自然会调用上述添加的回调函数,从而切换回socket的处理协程,从上次悬挂点接着往下执行。

之所以做到透明,是因为python socket上打了patch。所谓打patch,就是自己实现了一个socket模块替换了python的标准socket模块。

def patch_socket():
from gevent import socket
_socket = __import__('socket')
_socket.socket = socket.socket
...

gevent实现的socket模块,比起python的标准socket模块,做了以下修改:

  1. 将所有的socket设置成非阻塞。
  2. 修改关键函数,比如send,recv,发生阻塞(捕获到异常 EWOULDBLOCK)时,在socket的fd添加回调函数,并跳回到主协程。


综上所述,gevent不是没有事件监听回调,而是通过给python socket打patch,使其透明化,最终达到让编程人员用同步的思维去开发。
ps,给python socket打patch,固然好,但是有个小缺点,就是:python c扩展模块中的socket并不受gevent的管制和调度,因此用在gevent中的网络库,都尽量使用纯python库

Gevent工作原理(转)的更多相关文章

  1. gunicorn工作原理

    gunicorn工作原理 Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork ...

  2. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  3. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  4. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  5. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  6. ThreadLocal 工作原理、部分源码分析

    1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...

  7. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  8. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  9. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

随机推荐

  1. 数据库——SQL-SERVER练习(6) 数据库安全性

    一.实验准备 (1)运行SQL-SERVER服务管理器, 启动服务(2)运行查询分析器,  以DBA身份登录数据库服务器:      用户名sa,  密码123456(3)打开CREATE-TABLE ...

  2. [转]Apache Doris资料汇总

    参考资料 https://www.toutiao.com/i6709706901770207748/?tt_from=weixin&utm_campaign=client_share& ...

  3. python:王思聪究竟上了多少次热搜?

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 朱小五 凹凸玩数据 PS:如有需要Python学习资料的小伙伴可以加 ...

  4. python爬取网站视频保存到本地

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Woo_home PS:如有需要Python学习资料的小伙伴可以加点 ...

  5. Kotlin介绍(非原创)

    文章大纲 一.Kotlin简介二.Kotlin相比Java优势三.Kotlin与Java混合使用四.参考文章   一.Kotlin简介 1. 什么是Kotlin 安卓和Java,前者是最受欢迎的移动开 ...

  6. hadoop mapreduce求解有序TopN

    利用hadoop的map和reduce排序特性实现对数据排序取TopN条数据. 代码参考:https://github.com/asker124143222/wordcount 1.样本数据,假设是订 ...

  7. 【JavaWeb】Ajax基础

    Ajax介绍 Asynchronous JavaScript And XML(异步的JavaScript和XML): Ajax可以在不刷新页面的前提下,进行页面局部更新: Ajax不是新的技术,Aja ...

  8. mysql设置用户密码规则

    一.查看密码规则 SHOW VARIABLES LIKE 'validate_password%'; 二.规则显示介绍 | Variable_name | Value | +------------- ...

  9. 网页解析 -- bs4 和 xpath 的简单使用

    bs4 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便 中文文档:https://beautifulsoup.read ...

  10. 201871010111-刘佳华《面向对象程序设计(java)》第八周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第八周学习总结 实验七 接口的定义与使用 实验时间 2019-10-18 第一部分:知识总结 接口的概念: ①java为了克 ...