gevent 一点点

Luo Weifeng 2011-8-28

话说, 北京的天气还算很闷热, 星期天一队人马跑来公司噌网, 也能是年轻气盛,发正没老婆没孩子的, 在住处呆着也不爽, 开vpn也很慢,干脆就来公司了。 

好, 废话就说这么多, 这里我介绍一个python的一个异步并发库:gevent。 

gevent is a Python networking library that uses greenlet to provide a synchronous API on top oflibevent event loop.

具体的可以参见: http://www.gevent.org/intro.html
前面我也蜻蜓点水似的介绍过greenlet 和 libevent, 这里再解释一下, libevent就是个事件分发的引擎, greenlet提供了轻量级‘线程’支持(其实不是线程,就是greenlet context)。  按照官网的这个说法, gevent就是基于这两个东西的一个专门处理网络逻辑的并行库。 看一个例子就很容易明白。

concurrent_download.py

#!/usr/bin/python
# Copyright (c) 2009 Denis Bilenko. See LICENSE for details.

"""Spawn multiple workers and wait for them to complete"""

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey

# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

import urllib2


def print_head(url):
    print ('Starting %s' % url)
    data = urllib2.urlopen(url).read()
    print ('%s: %s bytes: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]

gevent.joinall(jobs)

这里的代码很简单,就是对urls里边的网址进行并行抓取,再打印出各自的信息, 这里要说的是 from gevent import monkey 这个monkey是第三方的替代库, 就是安全的将python自带的socket 和ssl模块使用 第三方更快的库来替代, 传说速度提高好多倍。这里的gevent.spawn 其实就是对greenlet.start 的一个helper封装。 gevent.greenlet 有对greenlet的支持, 所以可以放心使用, 而gevent中不像纯greenlet那样需要我们自己手动的指定运行流程,它自己随机的帮我们处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值