Python——eventlet.hubs
2014-12-22 21:49
405 查看
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,以及其管理的任何文件描述符和定时器,通常把这个函数放在主模块的第一行调用:
Hubs的实现是线程内的,eventlet.hubs.use_hub() 只在当前线程内起作用。当使用多线程且这些线程都有自己的 hub 时,需要在每个需要特定 hub 的线程函数前调用该函数。实际上不一定需要为每个线程指定一个hub,可以为主线程指定一个特定的hub,而让其他的线程使用默认的 hub。这种混合的配置方式也能正常工作。
也可以使用第三方的 hub 模块来取代内置的,只要将木块本身传给 eventlet.hubs.use_hub() 即可。比如:
MAINLOOP 只在第一次I/O发生时执行,而且它不是 __main__ 所运行在的那个 greenlet。这种延迟运行的方式解释了为什么不需要显式地调用 dispatch() 方法,也就是说代码不需要重构就可以开始使用 Eventlet。
暂停当前的协程直到给定的套接字或文件描述字准备好了 read或 write 或 指定的 timeout 已经过去。要等待 fd 准备好读就传入 read =True,要等待 fd 准备好写就传入 write =True;要指定一个超时限制,就传入参数timeout(秒)。 如果在套接字准备好读或写之前超时限制达到,会抛出 timeout_exc 异常而不是正常返回。
注: 这被认为是一个内部API,因此可能会未经弃用就发生意外的改变。
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实例 推荐
- python eventlet并发原理分析
- Issues with nova services and ‘timeout’ from Python eventlet w/ CentOS and RHEL
- Python eventlet
- python eventlet 模块学习tpool和greenpool
- Python——eventlet.event
- Python——eventlet.websocket
- Python——eventlet.backdoor
- eventlet python模块学习记录
- 练习PYTHON之EVENTLET
- python之高性能网络编程并发框架eventlet实例
- Python——eventlet.greenthread
- python eventlet并发原理分析
- python import eventlet包时提示ImportError: cannot import name eventlet
- Python——eventlet.wsgi
- openstack任务eventlet和python的GIL
- python eventlet并发原理分析
- Python——eventlet.greenpool
- eventlet引发的学习-python协程:eventlet[待续]
- Python学习之eventlet.greenpool