之前看的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程序员指南 中文翻译
pip该工具适用于python按装gevent,来做协程任务。学习协程,爬虫该工具不可缺少。
主要介绍了简单了解python gevent 协程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Python使用grequests并发发送请求过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
根据rpc协议的思想,使用python的协程gevent实现的一个基于tcp,只能python使用的rpc协议, 不能夸语言, 不过不需要写额外的比如protobuf协议。 通过把类实例化后put到一个自定义对象中,实现方法的注册。 客户端...
odoo包
CMS识别 python gevent实现
主要介绍了Python gevent协程切换实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了python基于gevent实现并发下载器代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
官方离线安装包,亲测可用
主要介绍了python 协程 gevent原理与用法,结合实例形式分析了Python协程gevent相关概念、原理、安装及使用操作技巧,需要的朋友可以参考下
gevent安装包,适用于使用协程的python代码,具体代码协程demo可看python栏目的协程
gevent 1.0rc2 for windows
由Gevent社区编写 gevent是一个基于libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。
主要介绍了Python基于gevent实现高并发代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
3、用gevent来实现协程并发完成耗时任务 代码如下: # -*- coding: utf-8 -*- import re from os.path import join from os import walk from gevent import monkey import gevent monkey.patch_all() def ip_po
一个用Python实现的Erlang结点,使用gevent库,努力同时与Python 2和Python 3兼容
python实现的udp服务器和客户端简单例子,测试的时候我两者都在同一台主机上运行,如果用在不同的电脑上只要把client文件里的HOST改成服务器运行的主机的ip即可