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 import hubs
hubs.use_hub("pyevent")
Hubs的实现是线程内的,eventlet.hubs.use_hub() 只在当前线程内起作用。当使用多线程且这些线程都有自己的 hub 时,需要在每个需要特定 hub 的线程函数前调用该函数。实际上不一定需要为每个线程指定一个hub,可以为主线程指定一个特定的hub,而让其他的线程使用默认的 hub。这种混合的配置方式也能正常工作。
也可以使用第三方的 hub 模块来取代内置的,只要将木块本身传给 eventlet.hubs.use_hub() 即可。比如:
from eventlet import hubs
from mypackage import myhub
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=<class 'eventlet.timeout.Timeout'>,mark_as_closed=None)
- 暂停当前的协程直到给定的套接字或文件描述字准备好了 read或 write 或 指定的 timeout 已经过去。要等待 fd 准备好读就传入 read =True,要等待 fd 准备好写就传入 write =True;要指定一个超时限制,就传入参数timeout(秒)。
- 如果在套接字准备好读或写之前超时限制达到,会抛出 timeout_exc 异常而不是正常返回。
- 注:
- 这被认为是一个内部API,因此可能会未经弃用就发生意外的改变。
Python——eventlet.hubs的更多相关文章
- Python——eventlet
eventlet语境下的“绿色线程”普通线程之间的区别: 1. 绿色线程几乎没有开销,不用像保留普通线程一样保留“绿色线程”,每一个网络连接对应至少一个“绿色线程”: 2. 绿色线程需要人为的设置使其 ...
- Python——eventlet.backdoor
eventlet.backdoor 是正在运行中的进程内的 Pyhon 交互解释器. 该模块便于检测一个长期运行进程的运行状态,提供了一种可以不阻塞应用正常操作的 Pyhon 交互解释器,从而极大地方 ...
- Python——eventlet.wsgi
eventlet 的 wsgi 模块提供了一种启动事件驱动的WSGI服务器的简洁手段,可以将其作为某个应用的嵌入web服务器,或作为成熟的web服务器,一个这样的web服务器的例子就是 Spawnin ...
- Python——eventlet.event
该模块提供eventlet的事件支持,事件提供了跨 greenthread 的操作原语. 同一个事件对象既可以发出事件也可以接收(等待)事件,不同的协程共享这一个事件对象,就为不同协程之间基于事件的同 ...
- Python——eventlet.websocket
使用该模块可以方便地创建 websocket 服务器,要创建一个websocket服务器,只需要将一个句柄函数用装饰器 WebSocketWSGI 装饰即可,然后这个函数就可以当做一个WSGI应用: ...
- Python——eventlet.greenthread
该模块实现 eventlet 中的 “绿色线程” 即协程. 相关的 greenlet 模块的介绍. 目录 一.模块级函数 sleep() spawn() 模块级函数 eventlet.greenthr ...
- Python——eventlet.greenpool
该模块提供对 greenthread 池的支持. greenthread 池提供了一定数量的备用 greenthread ,有效限制了孵化 greenthread 过多导致的内存不足,当池子中没有足够 ...
- python import eventlet包时提示ImportError: cannot import name eventlet
root@zte-desktop:/home/ubuntu/python-threads# cat eventlet.py #!/usr/bin python import eventlet from ...
- eventlet的学习
转自:http://bingotree.cn/?p=281 官方网站:http://eventlet.net/ 之前小秦我写了篇python中协程和yield的文章,这里小秦我再总结一下eventle ...
随机推荐
- 每日英语:Got 5 Minutes? 'Flash Fiction' Catches On
Chinese author Lao Ma has a simple approach to his short stories: In the face of life, everything is ...
- 4. Stacked AutoEncoder(堆栈自动编码器)
1. AutoEncoder介绍 2. Applications of AutoEncoder in NLP 3. Recursive Autoencoder(递归自动编码器) 4. Stacked ...
- ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来
1.1-ARKit物体跟随相机移动流程介绍 1.2-完整代码 1.3-代码下载地址 废话不多说,先看效果 1001.gif 1.1-ARKit物体跟随相机移动流程介绍 1.点击屏幕添加物体,已经在第三 ...
- java好用的邮件发送
1.action代码 // 发送邮件 String strEMAIL = Tools.readTxtFile(Const.EMAIL); //读取邮件配置 String strEM[] = strEM ...
- Memcaced多站点登录图解
- android 阿里云oss上传
购买了阿里云的oss空间,于是用它来存储图片,不过中间的使用算是出了些问题,导致很长的才成功. 不得不说,阿里云文档真的是无力吐槽...乱七八糟的.我完全是东拼西凑,才完成的图片上传功能. 走了很多的 ...
- git学习(六):git stash
对于更改操作的处理 使用git status命令可以看到当前工作区的状态: git status // 查看工作区的状态 // 对于已经git add工作区中文件 git reset HEAD < ...
- Android——事务
一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结 ...
- [开发笔记]-ASP.NET项目在IIS上使用虚拟目录
说一下我想要实现的效果: 假如我做一个图片展示类的网站,或者其他需要用户上传文件的网站,需要将用户上传的文件保存到一个Uploadfiles文件夹下,一般我们在做项目时用户上传的文件都是保存在网站项目 ...
- WCF安全:通过 扩展实现用户名密码认证
在webSservice时代,可以通过SOAPHEADER的方式很容易将用户名.密码附加到SOAP header消息头上,用户客户端对调用客户端身份的验证.在WCF 时代,也可以通过Operation ...