python中hub_Python——eventlet.hubs
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相关推荐
- python中hub_Python中文社区名称的统一
Github 好象没有投票功能哪,,, 不过,既然提起了, 俺也就抄发送一下, PyCon2013China 之后相关组委的深入讨论: 背景 俺就几个基本问题尝试厘清一下: CPyUG 的发展历史,俺 ...
- python中设置超时跳过,超时退出
python中设置超时跳过,超时退出. 在工作中遇到过 个问题 执行一条代码时间过长 而且还不报错,卡死在那.还要继续执行下面代码,如何操作. 下面是个简单的实例 pip安装 第三方eventlet这 ...
- Python中运用的基础库
库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...
- 它号称 Python 中性能最高的异步 Web 框架:超详细 Sanic 入门指南!
△点击上方"Python猫"关注 ,回复"2"加入交流群 作者:古明地盆 来源:https://www.cnblogs.com/traditional/p/14 ...
- 如何优雅的在python中暂停死循环?
死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...
- 关于python中的dict和defaultdict
dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- Python中正则表达式用法 重点格式以这个为准_首看_各种问题
20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...
最新文章
- 2017 .NET 開發者須知
- nginx生产环境常用功能include 、虚拟主机别名、rewrite、nginx status详细解析
- 精确人工智能——核物理与粒子物理领域的新生力量
- git config配置文件
- 可自动定时切换的选项卡/滑动门导航代码
- php框架快速入门,php-laravel4.0框架 简单快速入门
- Nginx 实现网站 http、https 配置
- 华为数据通信产品VRP操作系统的使用
- MySQL索引、事物
- linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
- Java 线程——Timer TimerTask
- 如何在java对象里访问Spring中已加载的property内容
- 计算机电源指示灯,为什么笔记本电脑电源指示灯一直闪?
- 扫描隧道显微镜STM功能介绍及用途
- Mysql 启动命令详解
- linux安装智能输入法,Ubuntu中文智能拼音输入法配置
- Exception thrown when sending a message with key=‘null‘
- 区块链行业人才市场大盘点(附求职指南)
- laravel5.4中orm中的wherein与多条件查询
- 容器化技术最佳实践1--容器化技术简介与Docker入门