Hub构成了 Eventlet 的事件循环,它分发 I/O 事件、调度 greenthread。Hub的存在使得协程被提升为 greenthreads。

Eventlet 有多种hub的实现,所以在使用之前应该选择最适合自己系统的实现:

epolls要求 Python 2.6 或 python-epoll 包,同时只支持 Linux。这是最快的纯Python hub。poll所有支持它的平台均可。selects哪都能用。pyevent基于libevent的后端,最快!默认是不被支持的,因为它不支持原生线程,但是你可以开启pyevent。如果你所选的hub不是理想的那个,可以切换成其他的hub。既可以通过环境变量 EVENTLET_HUB,又可以通过调用 use_hub() 实现。eventlet.hubs.use_hub(hub=None)决定使用哪一个hub,使用目标hub模块的名称来调用该函数。应该在应用开始任何I/O前开始调用该函数。调用该函数将会清除任何旧的 hub,以及其管理的任何文件描述符和定时器,通常把这个函数放在主模块的第一行调用:

"""This is the main module"""

from eventlet importhubs

hubs.use_hub("pyevent")

Hubs的实现是线程内的,eventlet.hubs.use_hub() 只在当前线程内起作用。当使用多线程且这些线程都有自己的 hub 时,需要在每个需要特定 hub 的线程函数前调用该函数。实际上不一定需要为每个线程指定一个hub,可以为主线程指定一个特定的hub,而让其他的线程使用默认的 hub。这种混合的配置方式也能正常工作。

也可以使用第三方的 hub 模块来取代内置的,只要将木块本身传给

from eventlet importhubsfrom mypackage importmyhub

hubs.use_hub(myhub)

Hub是怎么工作的

hub 有一个主 greenlet,MAINLOOP。当运行中的协程需要进行 I/O 操作时,它会在 hub 中注册一个 listener(这样hub就知道什么时候唤醒它),然后切换到 MAINLOOP (通过 get_hub().switch())。如果有其他准备运行的协程, MAINLOOP 会切换到他们,当他们完成执行或需要 I/O 时,又会将控制权切换给 MAINLOOP。以这样的方式,MAINLOOP 确保了每一个协程在自己有事要完成的时候都能够得到调度。

MAINLOOP 只在第一次I/O发生时执行,而且它不是 __main__ 所运行在的那个 greenlet。这种延迟运行的方式解释了为什么不需要显式地调用 dispatch() 方法,也就是说代码不需要重构就可以开始使用 Eventlet。

更多Hub相关函数

eventlet.hubs.get_hub()获得当前的event hub对象。注:这被认为是一个内部API,因此可能会未经弃用就发生意外的改变。eventlet.hubs.get_default_hub()Select the default hub implementation based on what multiplexing libraries are installed. The order that the hubs are tried is:自动选择默认的 hub 实现,尝试的顺序是:epoll、kqueue、poll、select,这里不会自动选择 pyevent hub,因为它不是Python线程安全的。注:这被认为是一个内部API,因此可能会未经弃用就发生意外的改变。

eventlet.hubs.trampoline(fd, read=None, write=None, timeout=None, timeout_exc=,mark_as_closed=None)

暂停当前的协程直到给定的套接字或文件描述字准备好了 read或 write 或 指定的 timeout已经过去。要等待 fd 准备好读就传入 read =True,要等待 fd 准备好写就传入 write =True;要指定一个超时限制,就传入参数timeout(秒)。如果在套接字准备好读或写之前超时限制达到,会抛出 timeout_exc 异常而不是正常返回。注:这被认为是一个内部API,因此可能会未经弃用就发生意外的改变。

python中hub_Python——eventlet.hubs相关推荐

  1. python中hub_Python中文社区名称的统一

    Github 好象没有投票功能哪,,, 不过,既然提起了, 俺也就抄发送一下, PyCon2013China 之后相关组委的深入讨论: 背景 俺就几个基本问题尝试厘清一下: CPyUG 的发展历史,俺 ...

  2. python中设置超时跳过,超时退出

    python中设置超时跳过,超时退出. 在工作中遇到过 个问题 执行一条代码时间过长 而且还不报错,卡死在那.还要继续执行下面代码,如何操作. 下面是个简单的实例 pip安装 第三方eventlet这 ...

  3. Python中运用的基础库

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

  4. 它号称 Python 中性能最高的异步 Web 框架:超详细 Sanic 入门指南!

    △点击上方"Python猫"关注 ,回复"2"加入交流群 作者:古明地盆 来源:https://www.cnblogs.com/traditional/p/14 ...

  5. 如何优雅的在python中暂停死循环?

    死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...

  6. 关于python中的dict和defaultdict

    dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...

  7. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  8. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  9. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

最新文章

  1. 2017 .NET 開發者須知
  2. nginx生产环境常用功能include 、虚拟主机别名、rewrite、nginx status详细解析
  3. 精确人工智能——核物理与粒子物理领域的新生力量
  4. git config配置文件
  5. 可自动定时切换的选项卡/滑动门导航代码
  6. php框架快速入门,php-laravel4.0框架 简单快速入门
  7. Nginx 实现网站 http、https 配置
  8. 华为数据通信产品VRP操作系统的使用
  9. MySQL索引、事物
  10. linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
  11. Java 线程——Timer TimerTask
  12. 如何在java对象里访问Spring中已加载的property内容
  13. 计算机电源指示灯,为什么笔记本电脑电源指示灯一直闪?
  14. 扫描隧道显微镜STM功能介绍及用途
  15. Mysql 启动命令详解
  16. linux安装智能输入法,Ubuntu中文智能拼音输入法配置
  17. Exception thrown when sending a message with key=‘null‘
  18. 区块链行业人才市场大盘点(附求职指南)
  19. laravel5.4中orm中的wherein与多条件查询
  20. 容器化技术最佳实践1--容器化技术简介与Docker入门

热门文章

  1. 什么是wiki?WikiWikiWeb 中文介绍
  2. freeline使用指南
  3. 使用msfvenom生成木马用于监听别人的操作
  4. LeTex 常用操作
  5. 欢迎中文社区新版主@黎卫东
  6. 191201 解决MagicMouse2速度延迟缓慢
  7. Java 解析GPS芯片 的经纬度信息
  8. Carthage安装使用
  9. 报错 : CRTC 63 尝试模式 CRTC 63:尝试 800x600@60Hz 模式输出在 1366x768@60Hz (通过 0)
  10. 无身份证、无证件、驾驶证可以领火车票高铁票动车票吗?临时身份证领票