Python协程

2017-12-19  本文已影响0人  等哈光圈

迭代器

判断对象是否是迭代对象:

  from collections import Iterable
  isinstance(obj, Iterable)

迭代器:Iterator 一个实现了iter()方法和next()方法的对象就是迭代器

生成器

判断对象是否是生成器:

from collections import Iterator
isinstance(obj, Iterator)

生成器的2中创建方法:

yield关键字的作用

唤醒两种方式(让生成器从断点处继续执行,第一次在执行生成器对象的时候,必须使用next(生成器对象)):

生成器对象.send(None)==next(生成器对象)

send()唤醒的好处:可以在唤醒的同时向断点处传入一个附加数据

协程

协程和线程的差异:线程切换非常耗能,协程切换只是单纯的操作CPU的上下文

协程模块 yield、greenlet、gevent

创建并执行协程

import gevent 
gr1 = gevent.spawn(指定的函数, 函数的参数)
gr2 = gevent.spawn(指定的函数, 函数的参数)  
gevent.joinall([gr1,gr2])  阻塞等待所有协程退出

在协程中实现猴子补丁

from gevent import monkey
monkey.patch_all()

进程、线程、协程对比

协程简单实现并发下载器(爬虫原理)

from gevent import monkey

monkey.patch_all()  # path_all函数官方建议在第二行调用
import gevent
import urllib.request
import time


def down_html(url):
    """URL就是网址"""
    # 请求服务器 返回值是一个响应对象
    print("开始爬取%s" % url)
    response = urllib.request.urlopen(url)
    # 取出响应对象中的数据
    data = response.read()
    print("获取%s网页数据%d字节成功" % (url, len(data)))
    f = open("11.html", "wb")
    f.write(data)
    f.close()


if __name__ == '__main__':
    begin = time.time()
    # 创建并且运行协程
    gr1 = gevent.spawn(down_html, "http://www.baidu.com")
    gr2 = gevent.spawn(down_html, "http://www.jingdong.com")
    gr3 = gevent.spawn(down_html, "http://taobao.com")
    gevent.joinall([gr1, gr2, gr3])
    end = time.time()
    print("花费%.2fs" % (end - begin))
上一篇 下一篇

猜你喜欢

热点阅读