`
kmoving
  • 浏览: 12104 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

python gevent实现机制

阅读更多
之前看的greenlet只是提供了基本的coroutine的作用,是最小的执行单元.但是要想使用,还需要提供一个调度器,来调度什么时候哪些greenlet应该执行.所以看了一下gevent的实现,当前的稳定版本使用的是libev.libevent的一种替代方案.性能上更优越一些.libev支持很多事件类型,但是最常用的是io和timer类型的.io类型的通过系统提供的相关系统调用实现(linux下是epoll),timer类型的通过维护一个最小堆实现.
看一下下面的代码:
import gevent
from gevent import monkey
monkey.patch_all()

def download():
    import urllib2
    urllib2.urlopen('http://www.google.com/').read()

c = gevent.spawn(download)
gevent.joinall([c])

gevent通过spawn创建并启动一个greenlet,此greenlet执行函数为download.启动这个greenlet是通过把这个greenlet加入到libev的prepare callback里面.libev在每次执行事件循环的时候都会调用prepare callback里面的函数,执行后把里面的callback清除掉.这样就能保证每次spawn的greenlet有执行的机会.并且只会执行一次.
在这个greenlet执行urlopen以及read的时候,因为涉及到io操作(socket.[send|recv]),gevent通过monkey patch把这些函数进行了封装,当调用相关的操作时就会创建一个对应fd的watcher加入到libev的事件列表里面.
当有相关的读写事件发生时,会触发相应的callback.相关的callback会调用greenlet的switch进行coroutine的切换.
通过上面的方式greenlet达到了调度器的目的.
分享到:
评论

相关推荐

    python Gevent程序员指南.pdf

    - **Long Polling**:实现长轮询机制,提高 Web 应用的实时性。 - **WebSockets**:利用 Gevent 支持 WebSocket 协议,实现双向通信。 - **聊天 Server**:构建基于 WebSockets 的聊天服务器,实现即时通讯功能。 #...

    简单了解python gevent 协程使用及作用

    `gevent` 是一个高效的协程库,它基于 `greenlet` 实现,为Python提供了一个完整的异步编程框架。与传统的多线程或多进程相比,`gevent` 能够更好地利用CPU资源,并且在处理I/O密集型任务时表现优异。 ##### 2. ...

    python-gevent-20.9.0.tar.gz

    《Python中的Gevent:协程实现与应用》 在Python编程中,Gevent是一个高效的并发库,它基于Greenlet,并且提供了对协程的支持。本文将深入探讨Gevent的安装、工作原理以及如何在实际项目中应用协程。 1. **Gevent...

    gevent开发指南

    Greenlets是Gevent实现轻量级并发的关键组件,它们是轻量级的协程,可以在多个Greenlet之间进行切换,以非阻塞的方式执行任务,且每个Greenlet都有自己的上下文信息。 Greenlets可以独立地管理状态和执行流程,可以...

    python基于gevent实现并发下载器代码实例

    总结起来,使用gevent实现并发下载器的关键在于理解greenlet的工作机制和gevent的monkey patching技术。通过将阻塞IO操作转换为非阻塞,gevent可以在单个进程中实现高效的并发,从而极大地提高了下载速度。这种并发...

    Python gevent协程切换实现详解

    在Python的世界里,gevent库是一个强大的工具,它利用了协程(greenlet)的概念,实现了高效的并发执行。本文将深入解析Python gevent中的协程切换实现,帮助开发者理解其内部工作原理。 首先,我们要明白gevent的...

    Python-一个用Python实现的Erlang结点使用gevent库

    标题中的“Python-一个用Python实现的Erlang结点使用gevent库”指的是一个Python项目,该项目旨在实现Erlang的节点功能,但完全使用Python语言编写,并且利用了gevent库来提高并发性能。Erlang是一种用于构建高可用...

    Python-gevent轻量级进程内的并发编程

    总的来说,gevent为Python开发者提供了一种轻量级的并发解决方案,通过greenlet和事件驱动模型,实现了高效的IO并发。它简化了异步编程的难度,让开发者能够更专注于业务逻辑,而不是并发控制。在处理网络I/O密集型...

    Python的gevent框架的入门教程

    gevent是Python的一个第三方库,它通过提供一个高级的并发模型来增强Python的并发执行能力。gevent基于greenlet库,该库实现了微线程(协程),这些微线程在遇到IO操作时可以自动让步,从而允许多个微线程在单个线程...

    Python库 | gevent-fastcgi-1.0.2.1.zip

    gevent是一个基于greenlet的Python并发库,它使用轻量级协程(greenlet)来实现异步I/O。Greenlet类似于Python的线程,但它们的切换更为轻便,不会涉及到全局解释器锁(GIL),因此在处理I/O密集型任务时表现优秀。...

    gevent-21.12.0-cp37-cp37m-win_amd64.whl.zip

    此外,gevent 还与许多其他 Python 库兼容,如 Flask 和 Django 等 Web 框架,可以轻松地在这些框架中集成 gevent 实现高并发处理能力。 总之,"gevent-21.12.0-cp37-cp37m-win_amd64.whl.zip" 是一个针对 Python ...

    Python库 | gevent-1.3.5-cp34-cp34m-win_amd64.whl

    `gevent`是一个基于`libev`事件库的Python网络库,它通过使用协同多线程(cooperative multitasking)模型,即绿线程(greenlet),来实现高效的异步I/O操作。在Python中,传统的多线程可能会因为全局解释器锁(GIL...

    Python库 | gevent-tasks-0.1.7.tar.gz

    首先,我们得了解`gevent`,它是Python中的一个异步I/O库,通过使用Greenlet(轻量级线程)来实现协程。`gevent`的核心优势在于其非阻塞I/O模型,能够高效地处理大量的并发请求,尤其适合于网络编程和高并发场景。而...

    Python-MrQueue一个Python的分布式worker任务队列使用Redis和gevent

    Python-MrQueue是一个基于Python的分布式worker任务队列,它利用了Redis作为中央消息代理以及gevent库来实现高并发的异步处理。这个框架设计的主要目标是为了解决大型项目中的任务调度、异步执行和工作负载均衡问题...

    Python库 | gevent-1.5a4-cp35-cp35m-manylinux2010_x86_64.whl

    在Python的世界里,有许多优秀的库为开发者提供了强大的工具,其中,`gevent`就是一款高效、并发的网络编程库,它基于greenlet实现了协程模型,极大地提升了Python应用程序的执行效率。本文将深入探讨`gevent`库,...

    Gevent指南.pdf

    在Gevent中,这种机制可以用来在运行时修改Python标准库中的某些模块,使其在IO操作时可以协作式地让出执行权给其他协程,从而提升效率。 4. Gevent的实际应用案例展示了一个select()函数的使用。select()通常用于...

    Python库 | gevent-1.1rc2-cp26-none-macosx_10_11_intel.whl

    `gevent` 是一个基于`libev`事件库的Python并发库,它采用协程(greenlet)的方式实现异步I/O。`gevent`库旨在简化网络编程,特别是处理大量并发连接时,能显著提高程序的执行效率。在`gevent`中,每个任务都是一个...

Global site tag (gtag.js) - Google Analytics