python-协程

迭代:使用for循环遍历取值的过程就叫做迭代
  比如:字符串、列表、元组、字典、集合
可迭代对象(Iterable):能够使用for循环遍历取值的对象就是可迭代对象
自定义可迭代对象:在类里面提供了__iter__方法创建的对象就是可迭代对象
  可迭代对象通过__iter__方法向我们提供一个迭代器,在迭代一个可迭代对象的时候,实际上就
  是先获取该对象提供的一个迭代器,然后通过这个迭代器来一次获取对象中的每一个数据。
自定义迭代器对象:在类里面提供__iter__和__next__的方法创建的对象叫做迭代器对象
迭代器的作用:记录当前数据的位置以后获取下一个位置的值
生成器:是一个特殊的迭代器,也就是说生成器依然可以使用next函数和for循环遍历取值
创建生成器:函数def里面存在yield(关键字)则表示生成器(使用了yield的函数就是生成器)
            代码执行yield会暂停,把结果返回给外界,再次启动生成器会在暂停的位置继续往下执行
生成器send方法:可以给生成器传参数,第一次启动生成器只能传None,一般第一次启动生成器使
用next函数
协程(Coroutine):又称为微线程,也可以说成用户级线程,在不开辟线程的基础上可以完成多任务
通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定
协程表示:在def里面看到含有yield关键字表示就是协程
协程目的:在单线程的基础上可以完成多任务,多个任务按照一定顺序交替执行
gevent方法:会根据耗时操作自动完成协程之间的切换执行
进程、线程、协程对比:
  (现有进程,进程可以创建线程,线程里面可以包含多个协程,协程是在不开辟线程的基础上可以完成多任务)
  1. 现有进程,然后进程里面可以创建多个线程,线程里面可以有多个协程
  2. 进程之间不共享全局变量,线程之间共享全局变量,但是要注意资源竞争的问题
  3. 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大
  4. 线程之间执行时无序的,但是协程在不开辟线程的基础上可以完成多任务,多个任务按照一定顺序交替执行
  5. 协程以后主要用再网络爬虫、网络请求、每开辟协程大概需要5k空间
  6. 开辟一个线程大概需要512k空间,进程需要资源更多
总而言之:
  1. 进程是资源分配的单位
  2. 线程是操作系统调度的单位
  3. 进程切换需要的资源很最大,效率很低
  4. 线程切换需要的资源一般,效率一般
  5. 协程切换任务资源很小,效率高
  6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
 
导入模块:from collections import Iterable :
  isinstance(对象,Iterable):判断对象是否为可迭代对象
  (isinstance可以判断函数的参数或者方法的参数是否为指定的类型)
 
导入模块:import gevent
     from gevent import monkey
monkey.patch_all():打补丁,让gevent能够识别系统的耗时操作及网络延时操作
变量 = gevent.spawn():创建协程完成任务
变量.join :让主线程等待协程执行完成以后程序再退出
gevent.joinall([变量1,变量2,变量3....])主线程等待所有协程执行完再退出
 
导入网络请求模块: import urllib.request
urllib.request.urlopen(地址):根据地址加载网络资源数据
posted @ 2018-05-18 15:38  庆长  阅读(178)  评论(0编辑  收藏  举报